Rotación
deLIDGs
Interface
RS-232-C
+-
í M
* *
^curso de INFORMATICA
• LENGUAJES BASIC Y COBOL
• HORARIO OPCIONAL
• MANANA, TARDE Y NOCHE
• CURSO DE 12 MESES
• GRUPOS REDUCIDOS
• UN ORDENADOR POR ALUMNO
• ENSEÑANZA INDIVIDUALIZADA
• PRACTICAS PARA EMPRESAS
NOVEDAD: ENSEÑANZA DUSGSDA POS ORDENADOS
INFORMATE EN:
Enrique Granados, 48, entio. dctia - Tel. 258 66 44
BARCELONA
Espoí y Mina, 6 pral. Tel. 23 16 02-03
ZARAGOZA
Niebla. 15. 1.\ iíqda. - Tel. 27 89 71
SEVILLA
Gran Vía. 51. entio. ízqda. - Tel. 25 48 11-12
LOGROÑO
SUMARIO
AÑO II - N.° 25 - OCTUBRE 1986
Aunque el Spectrum carece de
comandos que faciliten el
rellenado de figuras, es fácil suplir
esta deficiencia e incluso ir un
paso más allá y realizar filis con
entramados.
El mes pasado vimos cómo se
pueden invertir los gráficos
definidos por el usuario. En este
artículo estudiaremos un
problema algo más complejo: la
rotación de UDGs.
Enseñamos a tu ordenador a jugar
a las tres en raya, utilizando las
mismas técnicas que se aplican en
la programación de juegos de
inteligencia como el ajedrez o las
damas.
GUIA DEL HACKER:
PENTAGRAM
Descubrimos los pokes más
interesantes del último juego de
Ultímate y le añadimos una rutina
de control direccionai similar a la
de los anteriores programas de
esta firma.
INTERFACE
RS-232-C (II)
Segundo y último de los artículos
dedicados al montaje de un
inlerface RS-232-C, con la
descripción del software de
control, la lista de componentes y
los esquemas del circuito.
COMPRESOR
DE TEXTOS
El equivalente para textos de los
conocidos programas de
compresión de pantallas es esta
rutina que permite almacenar casi
cincuenta mil caracteres en 35K
de memoria.
FILL
ILUSTRADO
TRES
EN RAYA
ROTACION
DE UDGs
SERVICIO DE EJEMPLARES ATRASADOS
Para hacer su pedido, rellene este cupón HOY MISMO
y envíelo a:
TftillIfiniÉ'Mni Bravo Morillo, 377
mospeciran ™. 733 96 62 - 28020 maorid
Ruego me envíen los siguientes ejemplares atracados de TQD03-
PECTRUM .al precio de 300 pts.
El importe lo abonaré
□ POR CHEGUE □ CONTRA REEMBOLSO O CON MI TARJETA DE
CREDITO □ AMERICAN EXPRESS □ VISA O INTERBANK
Numero de mi tarjeta: ] | ] ‘ I . , í L I i I J ■ . [ J 1 i . i ^ .
Fecha de caducidad., , , , .. Firma
nombre .....
DIRECCION .
CIUDAD . . CP ...
PROVINCIA . . . , .. ...
Complete su colección de
üMtospectrun
A continuación le resumimos el contenido de los ejemplares
aparecidos hasta ahora.
Núm, 2 - 300 ptas.
Gráficos profesionales/Desplaza-
miento pixel a pixel/Utílización de ru-
tinas/Construcción. del ¡nterface
centronics/Programas de utilidad
para microdrive/Rutina reset en códi¬
go máquina/Análisis del editor de
textos Tasword/lnterfaces para im¬
presoras/Proigra mas.
Núm, 3 - 300 ptas.
Novedades sonimag'84/Ampliando
el Basic/Programas para ordenar
programas/Gráflcos con el VU-3D/
Lenguaje Forth/Archivos en micro-
drive/Programación de un interface
de irnpresora/Programas,
Num. 4 - 300 ptas.
De profesión: programador/Consola
para el Spectrum/Comparación có¬
digo máquina-Basic/Análisis progra¬
ma contabliidad/Caíendario/Pascal/
Programas,
Num. 5 - 300 ptas,
Roppys para Spectrum/Diseño asis¬
tido por ordenadür/64 Caracteres
por línea/Juego de la vida/Pascal/Asi
hacemos las portadas/Controí de
e valuaciones/Prog ramas,
Núm, 6 - 300 ptas.
Representación de funciones/Todús
los caminos conducen a la RGM/Jue-
gas/Pascal/Construcción de un lápiz
Óptico/Programas de gestión, El SITI/
Logo: torgugas para todos/ interrup¬
ciones del Z-80/Programas
Núm. 7 - 300 ptas.
Del 48 al PLUS paso a paso/¿Plotter
para Spectrum?/Juegos/Libros de
código máquina/Lápiz óptico. Pro¬
gramación det montaje/EI LOGO en
la escuela/Pascal/Floppys para
Spectrum/Prog ramas.
Num 8 - 300 ptas.
Amplia tu memoria... a 48 K/Arquitec-
tura: análisis dei PREYME/Juegos/
FORTH. Nociones básicas/Una clave,
please/QL Magazine. Ultimas nove¬
dades, análisis de software, Lengua¬
jes/Aula informática con Spectrum/
Programas,
Núm 9 - 300 ptas.
Spectrum parlanchin/Juegos/Aula
informática con Spectrum/Análisis:
Comercial 4/Pascal/Periféncos: Wa-
fadrive/QL Magazine: EASEL io mejor
de PSlON, Música con QL/Despfaza-
miento Pixel a Pixel. aportación de
lectores/Programas/Programer H.
Núm, 10 - 300 ptas.
Discos: invesdisc 200/Juegos/Dos
programas simultáneos/Protección
del software/Conozca extremadura,
consulte a su ordenador/Desensam-
blador Z-80/Sofware educativo/QL
Magazine: novedades informal. Hoja
de cálculo. Ajedrez/Construya su
propio Joystick/Pascai/prcgramas.
DISPONEMOS
DE TAPAS ESPECIALES
PARA SUS EJEMPLARES DE ZX
[sin necesidad de encuademación)
Núm. 11 - 300 ptas.
Actualidad/La otra cara del LOGO/
Juegos/El Spectrum habla castella-
no/SOFTAID ayuda para Etiopia/
S O S, aquí el Spectrum/Dibujar con
lápiz óptico/QL Magazine: Procesa¬
dor de textos, Teclas de función pro-
gramabies/Programas.
Núm. 12 - 300 ptas.
Actúalidad/lnteligencia artificial/Lá-
piz óptico dk'TRONiCS/Juegos/Aná-
lisis/Bingo/Z-80 PiO/Código máqui-
na/Análisis: MASTERFILE/Progra-
mas.
Núm. 13 - 300 ptas,
ActuaÜdad/Discos: Discovery 1/Jue-
gos/lnteiigencia artificial/ün nuevo
sistema operativo/GL Magazine: Ar¬
chive, Cartridge doctor. Aplicaciones
comerciales/Código máquina/Pro-
gramas
Núm. 14 - 300 ptas.
Actualidad, Spectrum 128/Cálculo
de estructuras para ingenieros y ar-
quitectos/HELP utilidades en micro-
drive/Juegos/EI microdrive ese des-
conocido/Código máquina/QL Ma¬
gazine: GRAPHIC QL Juegos Discos
de 720 K/Un nuevo operativo/Progra-
mas,
Núm. 15 - 300 ptas,
Actualidad/Spectrum 128/Un nuevo
operativo/Círculos redondos/Jue-
gos/Utilídades: BETA-BASIC/OL Ma¬
gazine: Introducción al SUPER BA¬
SIC. Nuevas utilidades/Hardware:
Puertas lógicas/Código máquina/
Programas.
Num. 16 - 300 ptas,
Actualidad/Cinco horas con
SCREEN$/Hardware práctico/Cái-
culos de infinita precisión/Juegos/
Un nuevo operativo/QL Magazine:
Gráficos en 5UPER-BA5IC. Dibujan¬
do con ratón. Archivos con Archive.
Programa/La ultima batalla. Juego
estratégico,
Núm. 17 - 300 ptas.
Actualidad/Gráficos interactivos/
Juegos/Código máquina/Un nuevo
operativo/Trucos de programación/
QL Magazine: Radiografía del QL
Gráficos en SUPER-BASlG/Ubros/
Programmas
Núm. 18 * 300 ptas.
Actualidad/lntroduccíón al C/Libros/
Juegos/De cinta a microcinta/VIsión
panorámica de los microprocesado¬
res más comunes/QL Magazine: Co-
py de grises Microprocesadores
68000. una familia numerosa/Curio-
seando en ia ROM/Programas.
EDITORIAL
DIRECTOR:
Enrique F. Larreta
REDACTOR JEFE:
Emiliano Juárez
REDACCION:
Ignacio Borrell, Octavio López.
Antonio del Rio
DISEÑO:
Ricardo Segura y Benito Gil
Editado por PUBLINFORMATICA, S. A.
Bravo Morillo, 377, 5.0 A. TeL:
733 74 13-28020 Madrid
Presidente:
Fernando Bolín
Director Editorial Revistas de Usuarios;
Juan Arencibia
Director de Ventas:
Antonio González
Producción: Miguel Gnieva
Servicio al cliente:
Julia González. TeL: 733 79 69
Administración:
PUBLINFORMATICA, S. A.
Publicidad Madrid:
Emilio García
Dirección, Publicidad y
Administración:
Bravo Muril'lo, 377.5 o A. TeL 733 74 13.
Telex: 48877 OPZX e 28020 Madrid
Publicidad Barcelona;
Lidia Cendres. Pelayo, 12. Tels. (93)
318 02 89 - 301 47 00, ext 27 y 28,
08001 Barcelona
Depósito legal: M-29041 -1984
Distribuye S.G.E.L, Avda. Vaídelaparra,
s/n. Alcobendas (Madrid).
Fotomecánica: Karmat, C/ Pantoja, 10.
Madrid.
Fotocomposición: Espacio y Punto
Imprime: Héroes, C/ Torrelara, 8. Madrid.
Distribuidor en VENEZUELA,
SIPAM, S, A.
AVD. REPUBLICA DOMINICANA, BDIF,
FELTREC - OFICINA 4B BOLEITA SUR
CARACAS (VENEZUELA)
Esta publicación es miembro de la
Asociación de Revistas de
Información an asociada a la
Federación Internacional de Prensa
Periódica, FIPP.
SUSCRIPCIONES:
Rogamos dirijan toda la correspondencia
relacionada con suscripciones a:
TODOSPECTRUM EDISA: Tel. 415 97 12
G/ López do Hoyos, 141 -50
28002 MADRID
(Para todos los pagos reseñar solamentes
TODOSPECTRUM)
Para la compra de ejemplares atrasados
diríjanse a la propia editorial
TODOSPECTRUM
C/ Bravo Murillo. 377. 5° A
Tel. 733 74 13 - 28020 MADRID
Si deseas colaborar en TODOSPECTRU M
remite tus artículos o programas a Bravo
Murillo,377, 5.c A. 28020 Madrid Los
programas deberán estar grabados en
cassette y los artículos mecanografiados.
A efectos de remuneración, se analiza cada
colaboración aisladamente, estudiando su
complejidad y calidad.
EL NUEVO
SPECTRUM
Como estaba previsto, la Personal Computer World Show
fue el escenario en que Amstrad presentó el nuevo Spectrum
128K +2, En contra de los rumores que se dejaron oír hace
unos meses, no se trata de una máquina revolucionaria, sino
más bien de un Spectrum 128 con algunas mejoras y un
aspecto diferente. La misma capacidad de memoria, gráficos y
sonido, pero por fin un teclado verdaderamente profesional y
un cassette incorporado que le confiere un innegable parecido
al Amstrad 464. También posee dos ports de joystick, que, por
desgracia, sólo podrán utilizarse con los nuevos joysticks Sin¬
clair, Y como ya viene siendo habitual, Amstrad ha vuelto a
rizar el rizo ofreciéndolo a un precio inferior al del propio
Spectrum 128.
Precisamente la tendencia generalizada a la bajada de pre¬
cios es la noticia más destacable últimamente en el campo de
la microinformática. No hace mucho tiempo (apenas unos
meses), comprar un IBM PC o cualquiera de las máquinas
compatibles nos hubiera costado más de trescientas mil pese¬
tas. Ahora, por menos de la mitad, es posible adquirir un com¬
patible más rápido, con más memoria y con mejor resolución
gráfica que el ordenador de IBM, el Amstrad PC 1512, autén¬
tico centro de atención de la Personal Computer World Show.
Y además de Amstrad, Investrónica y Spectravídeo también
están ofreciendo compatibles PC a precios de ordenador
doméstico, poniendo al alcance de los particulares equipos de
elevadas prestaciones que hasta hace poco estaban restringi¬
dos al ámbito empresarial.
TODOSPECTRUM
PENTAGRAM es la última creación de ULTIMATE, y tiene
un enorme parecido con los famosos Knight Lore y Alien 8.
Sin embargo, aporta algunas características interesantes que
lo hacen destacar sobre éstos.
L o primero que intento hacer a
ía hora de enfrentarme con un
juego para descubrir sus secre¬
tos, es conocer lo más posible acerca
de él, su argumento, el objetivo, la
forma de jugar, etc. Hay veces que
esto resulta bastante difícil, pues las
instrucciones pueden resultar enig¬
máticas (los señores de ULTIMA¬
TE son especialistas en esto). Sin
embargo, consultando diversas
fuentes, conseguí enterarme de qué
era lo que había que hacer. El objeti¬
vo del juego es encontrar el Penta¬
grama. Para ello, ayudados de unos
cubos llenos de agua mágica y que
podremos conseguir disparando a
los pozos que hay en algunas panta¬
llas, deberemos arreglar cuatro es¬
pecies de «obeliscos» que se encuen¬
tran en otras tantas pantallas. Una
vez hecho esto, aparecerá en una
habitación, hasta entonces vacía, el
Pentagrama, que no es otra cosa que
una estrella de cinco puntas inscrita
en un círculo. Ya sólo nos queda co¬
locar en cada una de las puntas una
de las cinco piedras con extrañas
marcas que se erfcu entran reparti¬
das aleatoriamente por tas 139 pan¬
tallas que tiene el juego.
Tras enterarme es esto, cargué el
programa para hacerme una prime¬
ra idea acerca de la protección y ju¬
gar unas cuantas partidas. Esto últi¬
mo es importante, pues debemos sa¬
ber exactamente cómo se comporta
nuestro personaje en determina¬
das situaciones, ya que esto nos ayu¬
dará a imaginarnos un poco cómo
serán las rutinas que lo controlan, lo
que nos facilitará su identificación si
damos con ellas.
Instalación en el
microdrive
La protección no parece compleja
en absoluto. Lo primero que carga
son dos programas BASIC. El pri¬
mero dibuja el logotipo de Erbe (la
distribuidora del programa para Es¬
paña) y carga el segundo. Aparente¬
mente no tiene ninguna otra fun¬
ción. Probé a saltármelo y cargar di¬
rectamente el segundo programa
BASIC. Al finalizar la carga pude
comprobar que el juego funcionaba
perfectamente. Ahora sólo tenía
que estudiar el segundo programa
BASIC. A primera vista sólo tiene
una línea, con número cero, que
contiene dos pokes típicos de tas
protecciones: POKE 23613, 0 y PO-
KE 23659,0. Sin embargo, estos pokes
no son lo que parecen ser, sino que
en realidad son otras direcciones y
oíros números los que se pokean,
estando cambiados los códigos AS¬
CII de estos para despistar. La ver¬
dadera función de estos pokes, una
vez se ha descubierto cuáles son, es
la de hacer aparecer el resto del pro-
1 DATA "DD21E0F911ÍC023ÉFF37C
D560530F1DD21004011001B3EFF37CDF
BFADD21A06DI19E7A3ÉFF37CD56122E"
2 DATA "Ú5D2000OF£3EC3329EC42
15SS32S9FC42ÍOO3C220BCC22ÍCCC21B
03B22EACA22DCD621F2EA11F5921157"
3 DATA "014E01EDB021A06D1Í005
E019E7AEDfe021FF3D22B2SC3Éi3E2BF92
B2B223D5C2A535C224B5C3680230E11 11
4 DA fA ' J 22S9SC360D23368023226
15C22635C22655CFBAFCD0116C39512C
D52B9CB4FC2 1 BB4CB572Ü68CB5F“ÚFD8 11
5 DATA "C2Ü904CB&7C2OES43EBFC
D52B9E6ul2a¿6F3AF324EC43EC932e7B
006962 19 i 847SBE20Q323-10F9E512 AB "
6 DATA "3D3207C4C52121A734CDC
5A F063CC5CDDA A F C13E7FCD52B9E6072
81CCB472Ü1EE60220 1631005E2i 1Ü5F Jl
7 DATA ‘■2iA7343EBÍ)3297&03E073
24aC4C3C5ñFI0D4CIEU0BA3EDD32B7B
03E07324BC431005EF3C393AFFD131S"
B DAIA "C&01AEFDCBO16E2SFA3AO
05CFE3O3816 F E 3A3012$6305F B7935F1
60021045B195E2356237E123E7EOE 2A 11
9 DATA CD52B9C301B5219D84100
321 A094 1104BFÜ10300E DBO1 BBFDDESD
D2 i004011001B3EFFCDC204DDE110F9"
10 DATA "18AD2B02CBE13E04CB412
801AFCB4928023E01CB5)2B023E02CB5
9 2 80 2 3E0 3FE O 4291C5F D DE .5 D D 2 10 U B9 111
11 DAIA II 6FA7CDBDC5DDE11600219
ia41?l9l9195Fl979E6F0B64F3Ee0CD5
2B92S02CBD93EF7CD52B9E6082B1353"
12 DATA M 02CBD9C30GBF04(.H01020
104u201 Ú2Ú1040101020 1047A7574737
26A69 5ü 5 $50 45FFC32 DB 42B02CBO B1 D M
sfo¡> PAPER' Os BGRDER O: INF 7: C
LtAft 28063: RLB'I'ÜRE : LET a*lüs
LET b=l 1: LEÍ 1 c=12: LEI ü = 13-. LE
I e=i4¿ LEÍ t“15s LET ad=6e4
210 PftINI AT O,Os“LEYENDO LINEA
:"¡ FOR = 1 TU 12: PRJNT AT 0,16
220 REAL) a*: LET ILEN aí-3
TO > : LET í TÜ LEN aí-4) :
IF LEN af/2::. :■ INT (LEN aí/,É> THEN
PRINT FLASH IsAT O, Oí '‘LINEA I
MPAR EN 11 i STÜF 1
230 LET w=0: POR “ I TÜ LEN a*
STEP i:: Lt'f v=‘VAL a* <;< ) #16+YAL a
X C 5-! + i ) ; LET w-v*+v
240 POKE ad T vi LET ad“ad+li NEX
F :::
250 LEI v=Os FQR x^l TÜ 4: LET
v=v* Í6+0AL bfí Ki: NEXT x : IF v<
w THEN PfUNT FLASH 1 ; AT 0,0* 11 E
RRQR EN LINEA STOP
260 NEXT z
270 OLEAR : LNPUT "QUIERES GRAB
Ah'LÜ EN CINTA ■ LIME AXf IF Ai
QR AX="S“ THEN SAVE "GARBA
LENTA" LLNE 200
290 FQft X =*23300 TO 23327 STEP 3
: READ A, RANDÜMl ¿E A'. ROLE X,
FEEK 23670: PÜH.E X+l.PEEK 23671:
F'ükE K+2 h Bs NEXT X
290 PRÍNI■ PÜN EN MARCHA LA ÜIN
TA ORI61NAL"! RANDÜMI2E USR 6E4
300 DATA 49493,1 50 ,A, L20,A t 72,A
t El5 , A , 87 , A , 89 , A f 6 , A , 17 » 49534, 60 ,
A,4
grama. En las líneas que aparecen,
lo primero que encontramos son de
nuevo los mismos pokes, pero esta
vez de verdad. Tras esto hay una lla¬
mada a una rutina en código máqui¬
na cuya dirección también es distin¬
ta de la que aparece en el listado. Lo
que viene después es sólo para des¬
pistar y no tiene ninguna utilidad.
La rutina en código máquina hace
un Idir de un bloque de 206 bytes a
la parte alta de la memoria. En estos
se encuentra una rutina de LOAD
de alta velocidad, aunque bastante
semejante a la de la ROM. Con esta
rutina se carga la pantalla de presen¬
tación y el buffer de la impresora,
para después ejecutar lo que se ha
cargado en el bufTer. Aquí se carga
el bloque principal a velocidad nor¬
mal. Ya tengo todos los datos que
necesito saber: el bloque principal
se carga a partir de la dirección
24064 y tiene 31390 bytes de longi¬
tud. Para asegurarme de que no es
necesaria la presencia del programa
BASIC en la memoria para que el
juego funcione correctamente,
pruebo a crear una cabecera falsa y
cargar solamente el bloque princi¬
pal con LOAD CODE. Al termi¬
nar la carga lo ejecuto con RANDO-
MIZE USR 24064 y compruebo que
funciona perfectamente. Ahora me
dispongo a pasarlo a microdríve. En
realidad, no es que sea necesario pa¬
sar un programa a microdrive para
estudiarlo, pero resulta verdadera¬
mente tedioso tener que cargar el
programa desde la cinta cada vez
que probamos un poke y deseamos
continuar la investigación.
Para pasar e! programa a micro¬
drive el único problema que tengo
es que comienza en una dirección
muy baja, pero esto es fácilmente
superable, pues queda espacio de
sobra por arriba, así que lo que hago
es cargarlo en una dirección más al¬
ta y transportarlo a su verdadera di¬
rección con un LDIR una vez finali¬
zada la carga. Además, también ten¬
go sitio de sobra para ubicar el
MONS, cosa que hago en la direc¬
ción 57000. Sin embargo no es posi¬
ble volver al monitor desde el juego,
ya que éste utiliza la memoria don¬
de se encuentra el desensamblador
para la construcción de gráficos y al¬
gunas otras cosas.
Los primeros pokes
Al empezar a desensamblar me
da la impresión de que estoy desen¬
samblando el Knight Lore. Es como
st hubieran cogido el lisiado fuente
de éste y hubieran hecho los cam¬
bios necesarios hasta conseguir el
listado del Pentagram. En la direc¬
ción 24064 hay simplemente una
instrucción DI y un salto a la direc¬
ción 44935 tras haber puesto la pila
en 24064. En la dirección 44935 em¬
pieza el programa principal.
Casi al principio, en 44967, hay un
LD A,5 seguido por un LD
(42785),A. No puedo resistirme a
probar a cambiarlo antes de conti¬
nuar. Como cabía esperar, es el nú¬
mero de vidas. Con esto ya podemos
elegir el número de vidas con que
queremos jugar. Ahora, sabiendo
que las vidas se almacenan en
42785, resulta fácil encontrar un po¬
ke para vidas infinitas, con sólo bus¬
car dónde es decrementado su va¬
lor. Me encuentro que se hace den¬
tro de una subrutina que comienza
en 49900, y que es llamada un poco
después del punto donde se inicia-
lizan las vidas. Esto me da pie para
pensar que desde la dirección 44997
en adelante se encuentra el bucle de
juego, y todo lo que hay antes se en¬
carga de la presentación y las opcio¬
nes.
El poke para la inmunidad fue
más costoso de encontrar, y no lo
conseguí hasta bastante después.
Encontré un lugar donde se testea-
ban los valores de (IX+0) y (IX+1), y
si ambos eran cero se saltaba a
44997, donde yo ya sabía que se de-
crementaban las vidas. Probé a eli¬
minar el salto. El resultado no fue el
esperado. Todo empezó con norma¬
lidad. Me acerqué a unos pinchos y
fui destruido. Parecía que el poke no
tenía ningún efecto. Sin embargo,
enseguida me di cuenta de que sí lo
tenía. Cuando el personaje «explo¬
tó», el programa pareció no enterar¬
se de ello. El resto de los seres que
había pululando por la pantalla con¬
tinuaron haciéndolo normalmente.
Todo parecía normal, salvo que el
protagonista ya no estaba y no vol¬
vía a aparecer. La causa es que el
punto modificado no se encarga de
comprobar si colisionamos con al¬
go, sino de comprobar si ya hemos
terminado de explotar. En cualquier
caso todas estas investigaciones me
servirían después para ir enterándo¬
me de qué era lo que debía hacer si
quería visualizar una determinada
pantalla y que se moviera todo lo
que había en ella. Pude averiguar
que el bucle principal de juego
siempre que no se saliera de panta¬
lla o nos mataran, se cerraba sobre
45018, porque ésta era la dirección a
la que se saltaba cuando la compro¬
bación anteriormente citada era ne¬
gativa. Después pude encerrar den¬
tro de este bucle otro más pequeño
que se repetía para cada uno de los
objetos existentes en la pantalla, ya
sean piedras, fantasmas, disparos o
el propio personaje. Cada objeto
ocupa 32 bytes, aunque nuestro per¬
sonaje ocupa el doble porque es tra¬
tado como dos objetos separados,
uno de cintura para arriba y otro de
cintura para abajo. Esta técnica ya
era usada en el Knight Lore, y ser¬
vía, por ejemplo, para utilizar las
mismas piernas en distintos perso¬
najes (el Sabreman, el soldado,
etc.), con el consiguiente ahorro de
memoria en los gráficos.
Ahora tenia más reducida la bús¬
queda, porque sabia que la compro¬
bación de colisión con los objetos
había de estar dentro de este bucle
pequeño. Lo que me despistó fue
que la comprobación se efectuaba
dentro de una subrutina a la que no
se llamaba con un cali. Dentro de el
bucle pequeño, en el que cada vez
se va actualizando el registro IX pa¬
ra apuntar a los datos del objeto co-
Objeto invisible 99
Pozo 120
Bloque movible 121
Runo 1 144
Runo 2 145
Runo 3 146
Runo 4 147
Runo 5 148
Disparo normal 150
Bicho con tentáculos 160
Bola amorfa 164
Zombie 168
Tabla 3.
Pokes predefinidos
0 Disparo normal
1 Dispara pozo
2 Dispara tronco movible
3 Dispara piedra sube-baja
4 Dispara piedra móvil 1
5 Dispara piedra móvil 2
6 Dispara árbol
7 Dispara araña
8 dispara alto
9 Dispara bajo
Tabla 1. POKES
Número de vidas POKE 44968,0
Vidas infinitas POKE 49917.175
No imprime vidas POKE 49310,201
Disparo sin soltar tecla
POKE 49465,0
Disparo automático
POKE 49454,24
POKE 49465,0
Inmunidad POKE 50247,24
Altura del disparo
POKE 49534,n
Duración sonido durante juego
POKE 49183,n
Pantallas donde se quiere empezar
POKE 49896,n
POKE 49897,n
POKE 49898,n
POKE 49899,n
Muerte instantánea
POKE 50248,0
Tabla 2. Pokes de disparo
(todos los pokes en 49493)
Nada ]
Abol 6
Araña 17
Pincho movible 28
Cepo 30
Cepo manso 31
Patas de Sabreman 32
Fantasma 48
Bloque movible 63
«Pedorretas» 66
Tronco movible 72
Mesa movible 73
Charco 74
Charco con planta 75
Piedra movible 79
Bruja 80
Piedra sube 84
Piedra sube-baja 85
Dragón sube-baja 86
Bloque móvil 1 87
Bloque móvil 2 88
Araña aleatoria 89
Cubo 90
Piedra inamovible 91
Dragón móvil 1 92
Dragón móvil 2 93
Tabla 4
Posibles ubicaciones
de runos
En cada partida se eligen de for-
nía aleatoria 5 lugares entre un total
de 20 posibles. Para modificar algu¬
no de estos 20, se deberán hacer los
siguientes POKES:
POKE D, Código de la habitación
POKE D+K Coordenada 1
POKE D+2, Coordenada 2
POKE D+3, Coordenada 3 {Veri)
Cuando D toma uno de los valo¬
res siguientes:
53669
53673
53677
53681
53685
53689
53693
53697
5370!
53705
53709
53713
53717
53721
53725
53729
53733
53737
53741
53454
■
respondiente (empieza en 42863 y
va siendo incrementado en 32) se
busca una dirección en una tabla,
utilizando como índice de la misma
el contenido de (IX+Ü). Entonces se
salta a esta dirección con un JP
(HL), asegurándose de que después
se retomará a 45086, donde continúa
el bucle principal. Esto me hace
pensar que (iX+0) contiene un có¬
digo ¡dentificador del tipo de objeto
de que se trata, y que para cada obje¬
to hay una parte del bucle que debe
ser distinta, y que por eso está colo¬
cada en una subrutina. Así, según
cada caso, se llama a una subrutina
u otra. El problema que tenía ahora
era averiguar a qué subrutina co¬
rrespondía el control de nuestro Sa-
breman. Por suerte recordé que en
una de las rutinas llamadas durante
la inicialízación se hacía un traslado
de bytes desde otra dirección hasta
42863, que es justo el comienzo de
la tabla de objetos. Estos no podían
ser otra cosa que los datos iniciales
del personaje (las coordenadas don¬
de aparecemos en la pantalla, la di¬
rección a la que miramos, etc.). El
primer byte de éstos era 32, así que
busqué qué subrutina correspondía
a dicho código. Esta se encuentra en
50240. En ella, tras una llamada a
otra dirección, se testea un bit refe¬
rido a IX, y realiza un salto condicio¬
nal según su valor. Es casi seguro
que es aquí donde se comprueban
las colisiones con otros objetos.
Pruebo a hacer incondicional el sal¬
to, y consigo la ansiada inmunidad.
Si en vez de hacerlo incondicional,
lo suprimo, el resultado es que mo¬
rimos nada más aparecer en la pan¬
talla.
Un Su per POKE
La verdad es que una vez encon¬
trados los tres pokes que he explica¬
do en el apartado anterior, no se me
ocurría qué otros pokes podían ser
interesantes. Durante la búsqueda
de aquéllos había encontrado algu¬
nos pokes curiosos por los efectos
que producían, pero ninguno era
realmente útil para facilitar la con¬
secución del juego. Como me pare¬
cía poca cosa lo que había descu¬
bierto anteriormente, decidí inten¬
tar añadirte al juego algo que no
tiene y que poseen la mayoría de
los juegos en tres dimensiones, in¬
cluidos Knight Lore y Alien 8: el
control direccional. Supongo que
no se lo han puesto porque supone
la necesidad de una tecla más, sin
embargo a mí me parece un ver¬
dadero fastidio porque estaba acos¬
tumbrado a controlar así al persona¬
je y no lograba hacerme con el con¬
trol rotacional. Para comenzar me
puse a buscar las rutinas de explora¬
ción de teclado y joysticks. Descubrí
que todas confluían en 48904, don¬
de se almacena el dato leído en la di¬
rección 42807, de modo que comen¬
zó a buscar puntos en los que se hi¬
ciera referencia a esta dirección. En¬
contré tres. El primero era el que ya
había visto, en el que es inicializada.
En el segundo, nada más leído el
dato, hace un and y se quedacon el
bit de recogida de objetos, así que
Sabiendo que el número de
vidas se almacena en la
dirección 42785, resulta
fácil conseguir un poke de
vidas infinitas.
ésta no podía ser la rutina principal
de control del movimiento. Por
eliminación, debería tratarse del
tercer punto de los que encontré.
Mi decepción fue mayúscula al
comprobar que no era así. En ésta
se hacía también un and, aunque
ahora el bit correspondiente a la
tecla de disparo. La única solución
era que se refiriera a la dirección
mediante los registros IX o IY. Pero
antes de continuar, decidí estudiar
un poco lo que parecía ser la rutina
de disparo. Esta rutina crea en la ta¬
bla un nuevo disparo siempre que
no existan ya dos de ellos y que la te¬
cla de disparo no la tengamos pulsa¬
da desde antes, con esto conseguí
otros dos pokes, el de poder disparar
varias veces sin necesidad de soltar
la tecla entre un disparo y otro, y el
de disparo automático. Pero lo más
importante esque encontré el punto
en el que se creaba la tabla con los
daots del disparo. Aquí pude ver
que el código del disparo es 150. En¬
tonces pensé: ¿qué pasaría si cam¬
biara el código del disparo?, ¿haré
disparos en forma de roca o algo así?
Hice la prueba con algunos valores y
los resultados fueron más que sor¬
prendentes. Podemos disparar cual¬
quier cosa: desde un tronco que nos
servirá para subirnos encima, hasta
una araña que será útil a quien pien¬
se que las pantallas son demasiado
fáciles, pasando por un árbol que
queda muy decorativo en medio de
la habitación. Cuando los vi los re¬
sultados me puse a probar con to¬
dos los códigos. Los resultados más
interesantes pueden encontrarse en
la tabla dos.
El cargador
Con todo lo que había descubier¬
to anteriormente, me encontraba en
disposición de elaborar un cargador
con diversas nuevas opciones.
I
Durante el estudio de la rutina de
disparo encontré una subrutina que
devolvía la dirección a la que estaba
mirando el Sabreman. Sabiendo es¬
to elaboré la rutina de control direc-
cional. El principio es muy simple:
calculo la dirección hacia la que
queremos dirigirnos y la comparo
con la dirección hacia la que va Sa¬
breman. Si son iguales modifico el
dato para que el programa crea que
se ha pulsado la tecla de avanzar. Si
son distintas, cambio el dato para
hacer creer al programa que se ha
pulsado izquierda o derecha, según
haya que girar a la izquierda o a la
derecha para pasar de la dirección
en la que estamos a la dirección en
al que queremos estar.
Naturalmente, como utilizamos
cuatro teclas para las cuatro direc¬
ciones, necesitamos otra más para la
opción de salto. Para este menester
he reservado la fila de la A a Enter,
además de la tecla 4. Por estas razo¬
nes, el control díreccional no se po¬
drá utilizar con la opción de teclado
(podremos jugar con el teclado, pe¬
ro mediante las teclas del cursor o
las del joystick Sinclair), ni con el
joystick Sinclair que corresponda a
las teclas 1-5, así que si queremos el
control direccional deberemos ulili-
zar joystick Kempston, los cursores
o el joystick Sinclair correspondien¬
te a las teclas 6-0.
Con todo lo que había aprendido
sobre el bucle principal mientras
buscaba el poke de la inmunidad, no
me fue demasiado difícil encontrar
la forma de ir visualizando secuen-
cialmente las 139 pantallas. El único
problema fue que éstas no estaban
numeradas de 0 a 138, como era de
esperar, sino de 0 a 149, quedando
enmedio algunos huecos que hacen
que se bloquee el ordenador al in¬
tentar visualizar pantallas inexisten¬
tes.
Por último, pensando en el polifa¬
cético poke del disparo, pensé quie
sería útil poder variar durante la par¬
tida el objeto que disparamos. Para
esto he incluido en el cargador, 10
teclas con pokes «definibles», y
que podremos seleccionar pulsando
Cada objeto, ya sean
piedras, fantasmas o
disparos, ocupa 32 bytes.
Sólo Sobreman ocupa el
dobie, ya que es tratado
como dos objetos
separados.
en modo pausa una tecla del 0 al 9.
Los pokes que queramos asignarles
habremos de ponerlos en la línea
300 del listado uno, empezando por
la dirección y el contenido del poke
para la tecla cero y terminando por
los de la tecla 9. En la tabla 3 se pue¬
den verlos pokes que se incluyen en
el cargador como ejemplo y que
pueden ser modificados sin ningún
problema.
Una vez introducido el cargador
pondremos la cinta original. Al fina¬
lizar la carga, y si todo ha ido bien,
aparecerá el conocido mensaje “c
1982 Sinclair Research ltd.”, pero
sobre fondo negro y sin borrarse el
dibujo de la pantalla de presenta¬
ción. Ahora podemos introducir
otros pokes que no necesiten variar
a lo largo de la partida, y que por tan¬
to, no necesiten estar entre tos 10
predefinidos, como pueden ser et de
vidas infinitas, o alguno así. Cuando
hayamos introducido todos tos po¬
kes que queramos, ejecutaremos el
programa con RANDOMIZE USR
24064. Comprobaréis que el juego
de caracteres especial del juego ha
desaparecido, y que los mensajes se
escriben con el juego de caracteres
de la ROM, además de que los espa¬
cios se sustituyen por iguales. Esto
es porque he necesitado la memoria
que ocupaba el juego de caracteres
para incluir e! cargador con las nue¬
vas opciones, ya que no había otro
lugar libre en la memoria.
Si todo ha ido bien, el juego em¬
pezará normalmente y lo controla¬
remos rotacionalmente. Para pasar
al control direccional, hay que pul¬
sar la tecla C o la N en modo pausa.
Para volver al control rotacional,
pulsar también en pausa las teclas V
o B. Además, con la Z podremos
grabar una pantalla en cinta y con la
X o la M abollaremos el juego.
Para visualizar las 139 pantallas
hay que pulsar ENTER, Para pasar
rápidamente a la siguiente, pulsar
Shimbol Shift. Si queremos conti¬
nuar el juego desde la pantalla que
aparezca en ese momento, pulsar
M. Para terminar de ver el mapa y
comenzar una nueva partida, pulsar
SPACE. Hay que tener cuidado con
la opción M dentro de la opción de
visualización de pantallas, pues po¬
demos aparecer encima de un pin¬
cho y perder todas tas vidas una tras
otra. Para ello, antes de pulsar la M
hemos de asegurarnos de dónde va¬
mos a aparecer, lo cual nos será indi¬
cado por una explosión que aparece
cada vez que pasamos a otra panta¬
lla.
Con todo esto, creo que se facilita
bastante la tarea de terminar el jue¬
go, aunque aún quedan muchas co¬
sas por descubrir. Espero que al¬
guien se anime a intentarlo.
Pablo Ariza
y * -- 4
*■ x a > . * . > * *;|¡
•■ ■: ■: :>■■■ •■; :■■ -y^
Completa tu colección de ZX.
A continuación te resumimos el contenido de los ejemplares
atrasados en existencia.
S/300 |
ladores
¡Liarla p.
Di dígita
Núm. 6/300 ptas.
Construya su propio jue
go/13 programas y monta
jes/ideas/Software,
Núm. 3/300 ptas.
El Spectrum por dentro.
Quince programas, juegos
y montajes Software.
:f:u: OJIA Di
sorrwMit
PARA
U STLCIRIIM
Núm. 16/300 ptas.
Cassettes solución a fas
problemas de grabación,
Núm. 10/300
Catorce pro<
cativos: geogr,
gralicos. razor
métricas, etonc
go máquina.
m. 7/300 ptas,
juegos inteligentes/Soft
re/ 11 programas/U
Núm: 14/300 ptas.
Cómo jugar al Hobbii
Gráficos de funciones. Pro¬
gramas de ajedrez, Cone¬
xiones con el P l/O, Progra¬
mas Multiplic P enseñar de¬
leitando. Libros, Forth, ter¬
cera parte.
Núm. 17/300 ptas.
Mapa de Atic-Afac. Estira
de caracteres, Dinámica de
una partícula. Libros. QL
Magazine. Programas,
Convertidor analógico-di-
gital con el P l/O.
Núm, 11/300 ptas.
Como crear marcianos y
otros monstruos.
Diez programas satélites
de Júpiter, rescate, interés,
circulo, préstamo hipoteca¬
rio.
Núm. 3/300 ptas.
La aventura es la aveniu
ra/12 programas/Juegos y
montajes/Código máqui¬
na,
Núm. 6/300 ptas.
Gráficos y sonido en el
Spectrum/Libros/Software/
13 programas,
l ,-i.
W'
ijtiüa
mcmiH iW-.JÉÉfc,..
■ i
EJEMPLARES ATRASADOS
mmm
M-r* :
MO»3Mr¡
Núm. 19/300 ptas.
Mapa de Kmghí Lore. No¬
ticias. Critica. Renta 85 (se¬
gunda parte). Libros. El ZX-
81 aprende a sumar. Scrofl
de ventanas. Programas. El
software que nos invade.
BASIC para principiantes
Núm. 21/300 pías.
Mapa de Underwurlde.
Noticias. Critica. ¿Has pro¬
bado? Programa especial:
barquitos. Sois muy diverti¬
dos. Libros para ol verano.
Un poco de física. BASIC
para principiantes (5),
Núm. 23/300 ptas.
Critica. ¿Has probado?
Profanaron profanado. No¬
ticias. Discos para Spec-
trum, Dossier educación:
Spoctrum en el aula, auroe-
val unción, Logo. Código
máquina. Programación
especial: quinielas. Monta'
fe a cámara lenla. BASIC
para principiantes (7).
Mapas y trucos de. High-
way encounler; Tir Na Nog,
Nightshade/¿Qué es el
Stack?/Frog rama especial/
C od i g o rn áq u i n a / Lo le r ia
pnmiliva/Stándares de la
i n to r m á I ica/Pr og rg mas.
Núm. 18/300 pías.
Rentas 85. Forth, sexta
parte. Programas. BASIC
para principiantes (3). pJot-
ting Gráficos, Libros. Usua¬
rios. Critica.
Nurru 20/300 ptas.
Vacaciones con informá¬
tica. Critica. Noticras. Pro
gramas. Son muy diverti¬
dos. Libros. Generación de
placas de circuito impreso.
Forth. Movimiento armóni¬
co simple, Spedrum musi¬
cal.
Dwwítr
Num. 22/300 ptas.
Noticias. Teclados profe¬
sionales. Critica. ¿Has pro¬
bado? Programa especial:
procesador de textos, Ge¬
neración de placas de cir¬
cuito impreso [segunda
parte). Prograi., QL espa
ñol. Quinielas en Spedrum
BASIC para principiantes
( 6 ).
Núm, 24/300 ptas,
Juegos/Mapas del No¬
dos o i Yesocf y Lords oí
Midnighl/¿Has probado?/
Sois muy diveríidos/Usua
rio/Ajuste de grálicas/MulN-
s<re h / Pr og r a m a s/Mo n l a
je: inversor de video para
ZX 81/Dossier QL,
Núm. 26/300 ptas.
Spedrum o QL, invasión
do los 128/cComo utilizar
mejor el micrQdrive?/Jue-
g os/Mapa del Dun Da rae h
y misión imposible/Progra-
mación eslruclurada/BA-
SIC.
mum. pías.
Juegos/Espccial juegos
Num. 27/300 ptas.
La vida de Srnclair/Pie-
zas musientes para Spcc-
Trum/Juegos/Mapas del
ARNHCM y SABQTEUR/
Areas/BASJC para impre-
DISPONEMOS DE TAPAS ESPECIALES
PARA SUS EJEMPLARES DE ZX
(sin necesidad de encuademación)
Para hacer tu pedido, rellena el cupón adjunto,
fcsúp' 05 ' córtalo y envíalo HOY MISMO a:
- ZX, Bravo Murillo, 377 «28020-MADftlD-Tel. 733 74 13 —
(en cada tomo
se pueden
encuadernar
6 números)
Los ejemplares atrasados de ZX serán una fuente constante de cono¬
cimientos. ideas, soluciones y entretenimientos para el futuro Todo lo
anterior hace recomendable que los guardes ordenadamente en una de
las tapas especiales para ZX Cada tapa puede contener 6 ejemplares
y cuesta solamente 650 ptas
Ruego me envíen los siguientes ejemplares arrasados de ZX .
.. .. ..al precio de 3ÜG ptas. cada uno
Por favor envíen . tapa(s) al precio de 650 ptas. cada una
{+ gastos de envío)
El importe lo abonare:
□ contra reembolso □ cheque adjunto □ con rni tarjeta de crédito
□ American Exprés □ Visa □ Interbank
Pecha de caducidad ..
NOMBRE .....
DIRECCION ......
POBLACION.....C.P.
PROVINCIA .......
I
MTEIFACE SBX Uaa
El primer programa se encarga
del envío de una palabra, y el segun¬
do de la recepción. A ambos se acce¬
de mediante instrucciones DEF FN,
como se indica a continuación;
DEF FN E(a)=USR 65024
DEF FN R()=USR 65081
La instrucción FN E(x) tendrá el
efecto de enviar por la línea RS-232
el valor de x. Si lo usáramos en una
sentencia de asignación —LET a=
FN E(x)—, podríamos saber si la or¬
den se ha llevado a cabo, o por con¬
tra la hemos interrumpido desde te¬
clado usando la tecla SPACE. Para
ello bastará con comprobar si el va¬
lor de retorno es mayor que 256. Si
así fuera, se ha producido un error.
Asimismo, un LET a=FN R(x)
asigna a la variable A el número re¬
cibido por la línea. La condición es
la ya comentada.
En cuanto a los programas en sí,
hay poco que decir que sea novedo¬
so o que no pueda leerse en el lista¬
do. En la rutina de emisión, hemos
de recoger el dato que se nos envía a
través de un DEF FN. Para ello em¬
plearemos una técnica que ya he¬
mos usado en otras ocasiones. El
contenido de DEFADD nos da la
dirección donde se almacena el ar¬
gumento del DEF FN que se está
procesando —ei que nos interesa
evidentemente— A partir de esta di¬
rección (en el área de variables), re¬
cogemos el dato de forma simple ya
que el número se almacena con for¬
mato de entero.
Por otro lado, recomendamos a
los interesados en programación en¬
samblador que examinen con deta¬
lle los bucles de las rutinas de entra¬
da y salida. Seguramente les será de
utilidad.
En la rutina de recepción se pue¬
den detectar errores, producidos ge¬
neralmente por desajuste de las ve¬
locidades de transmisión. El error
tiene lugar si el bit de arranque tu¬
viera una longitud menor de la espe¬
rada. Esto significaría que se están
transmitiendo datos a más veloci¬
dad de la esperada.
Acaso alguien se halla preguntan¬
do por la razón de ubicar este pro¬
grama al final de la RAM. Igualmen¬
te, los usuarios de Spectrum 16K ha¬
brán exclamado: «Maldita sea mi
suerte». Es necesario hacerlo ya
que, como muchos sabrán, el acceso
a los 16 primeros kilobytes de RAM
sufre interrupciones por parte de la
ULA, y esto puede hacer inservibles
los esfuerzos por conseguir una
temporización exacta.
Descripción del Hardware
El interface que presentamos ha
sido realizado siguiendo la más pura
filosofía Sinclair, intentando conse¬
guir las máximas prestaciones man¬
teniendo costes al mínimo.
Trataremos de ser breves en la
descripción del hardware.
El interface está direccionado en
el puerto de entrada-salida BFh
(1011 lili). Cuando leemos algún
dato de este puerto —por ejemplo,
mediante la instrucción IN A,( )—,
se activan los buffer triestado de IC2
por efecto de IClb, El resultado es
que el Z-80 lee en sus dos bits me¬
nos significativos el estado de las
líneas TXD y DTR. Los transistores
invierten los niveles, pero como el
estado bajo corresponde a un uno, y
al alto al cero, ios datos leídos son
los adecuados.
Si accedemos al puerto mencio¬
nado en una operación de escritura
(OUT ( ),<reg>), la salida de la
puerta ICla se pone en alto y los da¬
tos presentes en el bus se cargan en
los biestables 1C3. Se ha previsto
que al encenderse el aparato, auto¬
máticamente las salidas se pongan a
cero, pasando de este modo al esta¬
do inactivo.
Para conseguir tensiones negati¬
vas hemos usado dos típicas células
diodo-condensador, en lugar de las
tradicionales bobinas o transforma¬
dores, de difícil obtención o fabrica¬
ción. Dado que presentan una im-
pedancia de salida relativamente al¬
ta, ha sido necesario cargarlas con
una corriente aproximadamente
constante.
De aquí el valor inusualmente ba¬
jo de la resistencia de colector de T3
y T4.
Las resistencias R17 y R18 prote¬
gen las salidas frente a cortocircui¬
tos accidentales. La protección in¬
condicional de las salidas sólo pue¬
de garantizarse haciendo uso de
transistores de más potencia para
T2, T3, T5 y T6, tales como el BD
139 y BD 140. No recomendamos la
opción, a cambio de que se preste
un mínimo de atención ai realizar
las conexiones.
Aunque se ha incluido tanto en el
esquema como en el circuito impre¬
so, generalmente la resistencia en¬
tre DSR y masa no se conectará.
Realmente, es muy poco útil y disi¬
pa gran cantidad de calor.
El conectar de salida coincide con el del Interface 1.
Indicamos a continuación su patillaje:
Conector RS-232-C
1: No Conectado (NC)
2: TXD (Entrada)
3: RXD (Salida)
4 : DTR (Entrada)
5: CTS (Salida)
6: NC
7: GND (Tierra)
8: NC
9; 89V (DSR gralmente)
loo
110
120
130
140
150
160
170
180
190
200
210
220
230
240
250
260
270
2S0
290
300
310
320
330
340
350
360
370
380
390
400
410
420
430
440
450
460
470
480
490
500
510
520
530
540
550
560
570
DATA 243,221,42,11,92,221,86,4
DATA 14,191,237,120,230,1,40,11
DATA 62,127,219,254,31,56,243
DATA 6,255,251,201,6,9,122,163
DATA 23,31,203,195,203,19,237,89
DATA 205,117,254,16,244,22,3,237
DATA 81,205,117,254,205,117,254,72
DATA 251,201,243,14,191,6,1,237
DATA 65,237,120,230,2,40,15,62
DATA 127,219,254,31,56,243,6,3
DATA 237,65,6,255,251,201,205,143
DATA 254,237,120,230,2,32,239,6
DATA 128,205,117,254,237,120,31,31
DATA 203,24,0,48,244,22,3,237
DATA 81,72,6,0,251,201,253,102
DATA 71,46,6,0,0,0,45,194,122
DATA 254,37,0,32,243,0,46,5
DATA 45,32,253,0,0,35,201,253
DATA 102,71,46,3,0,0,45,194
DATA 148,254,37,0,32,244,0,38
DATA 2,37,0,32,252,201
REM
sum=0
FOR i=65024 TO 65189
READ a
sum=5utn + a
POKE i,a
MEXT i
IF sutn=19057 THEN STOP
PRINT "Error en el DATA. Repáselo"
REM
REM Ejemplo
REM
DEF FN E(a)=USR 65024
DEF FN R()=USR 65081
INPUT "Velocidad de t ransm i s i on: 11 \ vt
POKE 23681,INT <19200/vt-Ü.5)
REM Envío de un carácter
LET a$= 11 A"
LET b=FN EICODE a*)
IF b >255 THEN PRINT "ERROR de tr ansnii sion ": STOP
PRINT "Carácter enviado"
REM Recepción de un carácter
LET a=FN r i)
IF a>255 THEN PRINT "ERROR: velocidad desajustada":STOP
PRINT "Valor recibi do:"}aj
IF a>32 THEN PRINT "í"JCHRÍ a;”)"5
PRINT
0001
i*************************
0002
(** RUTINA
DE EMISION *#
0003
0004
0005
¡(O Luis Miguel BRUGAROLAS
0006
0007
oooe
RS232
EQU
191
0009
0010
QRG
OFEOOH
0011
0012
EMIRUT
DI
0013
LD
IX,í3C0BH)
0014
LD
D, ( IX+04)i Cogemos
0015
1
dato a enviar
0016
LO
C,RS232\Di rece ion
0017
í
del puerto
0010
DTWT
IN
A, (C) S Lee puerto
0019
AND
01 i DTR
0020
JR
Z.EMIT
0021
0022
LD
A,?FHí Núestreamos
0023
IN
A, ÍOFEHU SPACE
0024
RRA
0025
JR
C,DTWT
0026
0027
LD
B,OFFHi Indicamos
0020
El
f condición de no
0029
REI
; ej ecutado con
0030
S
byte alto a cero*
0031
EMIT
LD
B,09íNum de bucles
0032
LD
A,Di Dato a enviar
0033
OR
A i CF = 0
0034
RLA
0035
EMTLP
RRA
0036
SET
G,E;CTS en bajo
0037
RL
EíEl bit menos signi
0030
*
ficativo de E es el dato
0039
?
a enviar.
0040
OUT
í C) ,E j Lo envi amos
0041
i
con CTS en bajo.
0042
CALL
DEL A Y
0043
DJNZ
EMTLP
0044
0045
LD
D , 3
0046
OUT
ÍC) ,D
0047
CALL
DELAY
0040
CALL
DELAY
0049
1
LD
C, B í B = 00
0050
El
0051
RET
íVuelve con BC~00
0052
0033
0054
RUTINA
DE RECEPCION **
0055
0056
0057
RECRUT
DI
0Q5S
LD
C,RS232
0059
LD
B,01 \ CTS en alto,
0060
i
1
RXD en bajo.
0061
OUT
(O ,B¡Estamos prepar
0062
0063
UTDT
IN
A, (Cl
0064
AND
02; TXD
0065
JR
2,RD;Se recibe bit
0066
1
de comienzo*
0067
LD
A,7FH
0068
IN
A,(OFEH)
0069
RRA
0070
JR
C, WTDT
0071
0072
ERROR
LD
9,03
0073
OUT
(O , Bl CTS y RXD a i
0074
LD
B,OFFH|Indicamos
0075
í
error.
0076
El
0077
RET
0078
0079
RD
CALL
DEL.5f Esperemos
0000
i
medio periodo.
0081
IN
A, <C>
0082
AND
02)TXD
0003
JR
NZ,ERROR i!Hsy un
0084
í
cera en le 1lnee!
0085
LD
B,10000000B
0086
6ETLP
CALL
DELAY
0087
IN
A, <C)
0088
RRA
0009
RRA
(CF: bit recibido
0090
RR
BtPesa a b7 de B
0091
NOP
(Hace tiempo para
0092
í
compatibi11 zar con
0093
í
DELAY
0094
JR
NCjGETLP
0095
0096
LD
D, 03( RXD y CTS •
0097
OUT
(C),D( cero
0098
LD
C, B
0099
LD
B.OO
0100
El
0101
RET
¡BC: dato recibido
0102
0103
i 44#**#44##*^4****44*^#*4*
0104
;## RUTINAS DE RETARDO *#
0105
i **************************
0106
0107
0100
DELAY
LD
H* íIY+71)
0109
DELLP2
LD
L,ó
0110
DELLP1
DEFB
0,0,0
011 1
DEC
L
0112
JP
N2,DELLP1
0113
DEC
H
0114
NOP
0115
JR
NZ,DELLP2
Olió
NOP
0117
0118
LD
L,5
0119
DELLP3
DEC
L
0120
JR
NZ t DELLP3
0121
NOP
0122
NOP
0123
INC
HL
0124
RET
0125
0126
DEL. 5
LD
H,(IY+^I i
0127
DEL.52
LD
L, 3
0128
DEL,51
DEFB
0,0
0129
DEC
L
0130
JP
NZ,DEL.51
0131
DEC
H
0132
NOP
0133
JR
NZ,DEL « 52
0134
NOP
0135
LD
H, 2
0136
DFL
DEC
H
0137
NOP
0138
JR
NZ,DEL
0139
RET
RESISTENCIAS (1/4 W, 5%);
R1,2 = 2K
R3, 4= 1K
R5= lOOhm
R6, 7 = 4K7
R8, 9 = 100K
RIO, 11 = 33K
R12, 13 = 330 Ohm 1/2 W
R14 = 330Ohm IW
R15,16= 15K
R17, 18, 19,20 = 47 Ohm
R21,22 = IK
R23.24, 25 = 10K
TRANSISTORES:
TI = BC547 (BC548,9)
T2 = BC557 (BC'558,9)
T3, 4, 7, 8= SC159U
T5, 6, 9, Í0 = SC149B
CONDENSADORES
Cl = 4,7 nF
C2= lOOnF
C3,4 = 470 [íF 16V
C5 = 470 (iF 25V
C6, 7= lOOnF
DIODOS:
DI.2,3, 4,5= IN4I48
D6, 7 = Zener 7,5V I/4W
CIRCUITOS INTEGRADOS:
ICI = 74LS27
IC2 = 74LSI26
IC3 = 74LS74
tC4 = 555
COBRA'S
ARC
DINAMIC
SPECTRUM 48 K
Los sacerdotes de una cultura
milenaria vivían plácidamente
en un reino lejano, dedicados por
entero a la veneración del dios
Cobra. En su honor construyeron
un templo inmenso en el que
durante siglos fueron
depositando tesoros, joyas, oro...
Asustados por las profecías del
adivino Werdhal, que vaticinaba
un maremoto que asolaría sus
tierras, construyeron alrededor
del tesoro un inmenso barco, tan
grande como una pirámide. Un
inmenso barco que quedo
perdido entre las gigantescas
olas cuando la profecía se
cumplió; íejos, muy lejos, nadie
sabe dónde.
Los aficionados a los juegos de
aventura «genuinos» estamos de
enhorabuena. No es cosa
corriente el que se produzcan
este tipo de juegos por y para
hispanoparlantes, y la verdad es
que ya estábamos hartos de
andar de aquí para allá con el
diccionario intentando
acoplamos al molesto «argot
anglosajón» que suelen utilizar.
Una vez más ha sido Dinamic
quien ha roto el muro que parecía
impedir a las casas españolas el
sacar a la luz juegos de este tipo.
Pero no por ser una excepción va
a librarse este juego de la
implacable critica que es común
en estas páginas, y ya va siendo
hora de que nos internemos en el
juego para ver qué puede tener
de positivo y qué de menos
positivo.
Junto a la buena presentación y
cuidado por el detalle (algo, por
otra parte, difícilmente separable
del nombre de Dinamic), debe
resaltarse el uso que se hace de
un menú de iconos como forma
de dirigir al personaje en lugar
del clásico diálogo, más
complejo, pero seguramente
preferido por todo aventurero
que se precie. De todas formas
no deja de ser algo bastante «al
día» que es agradecióle como
forma de experimentar nuevas
vías en este mercado. Además
cada mensaje de Jos que nos da
el ordenador es acompañado por
su correspondiente frase (sí,
habla, pero de forma bastante
«gangosa» y a un nivel bajísimo).
Cuando nos adentramos algo en
el juego nos encontramos con
que deja bastante que desear a
quien esté acostumbrado a los
grandes juegos de aventura
ingleses como son el Hobbit o
tantos otros. La flexibilidad de
movimientos, personajes y
diálogos tan patente en estos no
se encuentra fácilmente cuando
tenemos que limitarnos a un
pequeño juego de iconos y
seguir un flujo demasiado rígido
para conseguir permanecer vivos
algunos minutos.
FRIDAY
THE 13TH
DOMARK_
SPECTRUM 48 K
Basado en la conocida pelícuJa
de Ja Paramount, Viernes 13, es
este un juego que se ha dado a
conocer de tal forma por la
estudiada campaña de marketing
que le ha precedido, que hoy
hablan de él incluso quienes
jamás han llegado a probarlo.
Comienza a ser esto algo normal,
derivado del increíble
crecimiento del mercado en los
últimos tiempos y su gran
dinamismo. Un juego hoy sólo
está en cartel durante dos o tres
meses, y en ese tiempo no da
tiempo a que corra la voz de la
crítica popular como en los
primeros tiempos; aquellos
tiempos heroicos en los que sólo
nos decidíamos a gastar nuestro
dinero en un juego cuando era
de dominio público que éste era
una obra de arte. Hoy las cosas
comentando en esta sección.
Un tranquilo día de campo en el
lago de cristal va a ser turbado
cuando Jason, un zombie en toda
regla, comienza a atacar a tus
amigos y compañeros de
acampada. Deberás buscarlo
entre ellos y luchar con él para
vencerle. Recuerda que sólo hay
un lugar donde Jason no se
atreve a entrar; allí donde se
encuentre la cruz podrá ser el
santuario donde se refugien tus
amigos. Valor y adelante.
Como podemos ver, la trama
inicial (por otra parte
condicionada por la película) es
bastante clásica y no aporta
apenas nada realmente
interesante, pero lo más
significativo es que tampoco
descubramos nada innovador
cuando nos fijamos en la parte
técnica del asunto. Unos sprites y
gráficos en general bastante
«sosos», dos dimensiones, un
mapa más bien pequeño,... en fin,
que pasó por nuestros ojos sin
llamarnos la atención en
absoluto. Tampoco es que tenga
grandes defectos ni faltas graves,
pero hoy en día es necesario algo
más que un carecer de defectos
para triunfar en un mercado tan
saturado de títulos.
han cambiado, ios intereses
económicos son muy fuertes y no
son ya programadores los que
controlan las empresas de
software, sino especialistas en
publicidad y psicología de
masas.
Pero hay que recordar que bajo
cada título hay un programa para
nuestro ordenador, un programa
que es lo que va (o no) a
hacernos disfrutar y lo que se
supone que deberíamos estar
WINTER
GAMES
EPYX
SPECTRUM 48 K
y «se pega a los dedos» con
facilidad. En presentación se
cumple a la perfección,
haciéndolo un juego muy
completo dentro del ámbito que
le corresponde. El estar dividido
en dos partes (tres pruebas por
cara, al viejo estilo) permite a los
programadores derrochar más
memoria y trabajar más a gusto,
aunque, como parte negativa, el
jugador perderá bastante tiempo
con las tediosas cargas del
cassette.
Aunque parece que ha pasado
algo la fiebre de los juegos
deportivos que aquél «Decathlon»
puso tan de moda, aún siguen
vendiéndose «versiones» más o
menos diferenciadas entre si que
casi permiten hablar de una
importante subclase de juegos;
juegos que han marcado un hito
en la «movida» evolución de este
interesante mercado en los
últimos años.
Pero es esta vez un juego que
aporta algo nuevo a esta
repetitiva clase. Como indica su
propio nombre se trata de unos
Juegos de Invierno, con sus
pruebas características que
ponen las cosas interesantes
desde el comienzo.
Preparémonos para competir
sobre la nieve y el hielo en las
más duras pruebas a las que
puede verse sometido un curtido
deportista invernal.
Bobsled, salto de ski, patinaje
artístico, patinaje estilo libre, Hot
Dog aéreo y ski de fondo son las
competiciones en las que
deberemos probar nuestra
pericia. Pruebas entretenidas y
bien acabadas en general que
hacen de este juego (Decathlon
aparte) todo un «cabeza de lista»
dentro de su gama. Típico juego
de competición, sólo resulta
realmente divertido cuando son
muchos tos jugadores que se
turnan en busca del oro (admite
hasta ocho posibles).
En la parte técnica cabe resaltar
unos fondos muy espectaculares
junto a un personaje principal
demasiado sencillo pero bien
animado. La sensación es buena
Truc hit rirss
-HOTS PULSE
CQKTESTAMT
CATALOGO DE SOFTWARE
PARA ORDENADORES
PERSONALES IBM
TODO EL CATALOGO DE SOFTWARE
CON MAS DE 800 FICHAS
1. a ENTREGA 3.500 — PTAS.
(400 FICHAS + FICHERO)
RESTO EN TRES
ENTREGAS TRIMESTRALES
DE 1.500,— PTAS. CADA UNA.
PRECIO TOTAL DE LA SUSCRIPCION ■ 8.000.— PTAS.
CUPON DE PEDIDO
El importe lo abonaré: POR
CON MI TARJETA DE CREDITO
CHEQUE □
□
CONTRA'htE EMBOLSO □ J
Re f CATALOGO DE SOFTWARE ,
SOLICITE HOY MISMO
EL CATALOGO DIRECTAMENTE A
Cargue 8.000 ptas a mi tarjeta American Express □ Visa □ interbank
Numeres fie mi tarjeta
1
1
1
¡ntoúis.s .1
Fecha de caducidad _ _
Firma
i
MOMRRF _
l
BRAVO MORILLO, 377 - 5.° A
28020 MADRID
O EN LOS CONCESIONARIOS IBM
CAI i F
i
K
CIUDAD
n p
I
1
PROVINCIA
l
VECTRON
3D
FIREBIRD
por tan extraño laberinto en
cualquier cosa menos fácil,
aunque con unas buenas dosis
de concentración podemos
conseguir cierto control de vez
en cuando. La sensación es
buena, y la cosa se pone aún
más interesante cuando
conseguimos ponernos a la cola
de algún enemigo para
acribillarle con las nutridas
ráfagas del láser de abordo.
De todas formas la velocidad de
nuestra nave es excesiva para
quien comienza (y también para
el que no es tan novato), y
desgraciadamente no puede ser
modificada al gusto del jugador,
que suele acabar chocando
contra las paredes y las naves
que circulan en sentido contrario
a los pocos segundos. La opción
«map», que sobreimpresiona un
plano del laberinto y sus
«habitantes» no sirve de mucho,
pues la nave sigue moviéndose a
su enorme velocidad, y no se
puede prestar atención a las dos
cosas.
Dejando a un lado esos
pequeños grandes detalles que
lo hacen tan complicado para
nuestras humanas mentes, hay
que hablar de un juego bastante
logrado técnicamente y que, a la
vez que puede catalogarse como
un clásico, se sale bastante de la
forma de ser de la mayoría de los
títulos que están apareciendo
últimamente. Un juego que
rebosa acción por los cuatro
costados y que pondrá las cosas
difíciles a quienes se las den de
¡mbatióles en programas de este
tipo.
SPECTRUM 48 K
Nos encontramos con un 3D de
lo más puro, uno de esos juegos
en los que se sacrifica casi todo
por conseguir una buena
sensación de tridimensionalidad
y perspectiva. Se trata de un
clásico laberinto en el que sólo
nos encontraremos con un
sencillo punto de mira, fas líneas
que representan las paredes, y
unos enemigos no tan
esquemáticos como nos tienen
acostumbrados en este tipo de
juegos. La velocidad conseguida
es muy grande para la relativa
calidad de ios gráficos y su
interesante animación.
El conducir nuestros Spectrum
GHOST’N
GOBLINS
ELITE _
SPECTRÜM 48 K
Por fin ha visto la luz Ja versión
para Spectrum de este juego, tras
haber pasado por las manos de
millones de jugadores en las
típicas «máquinas de
marcianitos» de miles de bares y
salas de recreativos. Se repite
esa maniobra que ya nos resulta
familiar como es lanzar versiones
de estos juegos para todos los
micros domésticos, justo cuando
su nivel de atracción en ese otro
mercado comienza a disminuir, y
aprovechando que todavía son
muchos los «viciosos» que darán
cualquier cosa por tener su
programa favorito en casa y no
tener que soltar «cinco pavos»
cada vez que deseen hechar una
partida. Parece que Elite se está
convirtiendo en una especialista
en esto como pudo comprobarse
no hace mucho con esos
«bombazos» que fueron (y siguen
siendo) Commando y Bomb Jack.
Como todos los que tienen esa
procedencia, se trata de un juego
en el que prima la acción. Todo
su atractivo reside en unos
sprites «simpáticos» que se
mueven muy rápida y muy
suavemente. Un secreto que
empieza a ser de dominio público
y que no falla: denle al jugador un
personaje sencillo pero con
mucha velocidad de reacción, de
forma que consiga «sentirse él», y
le harán feliz.
Nuestro protagonista deberá
moverse a lo largo de
cementerios, riscos y otros
lúgubres parajes en busca de la
bella princesa que se hafla presa
de un pérfido y endemoniado
señor feudal. Habrá de tener
cuidado de esquivar o destruir a
los abundantes «zombis» que
surgen de las entrañas de la
tierra con el objeto de acabar con
las escasas vidas de que dispone
nuestro héroe. Otros enemigos
también se disputarán el acabar
con nosotros, por lo que
deberemos ser generosos en el
uso de las inacabables armas de
que disponemos.
El acabado general del programa
no es del todo malo, pero ha sido
bastante recortada la versión
original para conseguir acoplarla
al nuevo ordenador. Lo que más
ha cambiado ha sido la parte
gráfica, sobre todo lo referente a
los colores, dadas las
limitaciones del Spectrum en este
sentido. Esto es un fuerte revés
para este juego y desde luego
rompe mucho el «encanto» que
éste tenia para ese público que to
puso en la cúspide en su día.
Todo un «matar o huir para
sobrevivir», destroza los nervios
de cualquiera a las pocas
partidas. De eso se trata, ¿no?
5
Compresión
de textos
A la hora de almacenar textos en la memoria del
ordenador, lo más corriente es colocar sobre cada una
de las posiciones de la RAM un código ASCII
exclusivamente, sin más complicaciones. De esta
forma, si 35 Kb corresponden a 35840 bytes, utilizando
la misma cantidad de memoria se podrán almacenar
35840 caracteres codificados en ASCII. Pero, todo sea
por aprovechar hasta el último byte de nuestro micro,
esta situación puede cambiar ahorrando una tremenda
cantidad de memoria gradas a una sencilla rutina en
código máquina.
E l juego de caracteres del SPEC-
TRUM está formado por 96 le¬
tras, números y signos especia¬
les. Cada uno de estos caracteres es¬
tá definido por un código ASCII
comprendido entre 32 y 127.
Si nos fijamos en el formato bina¬
rio de esta codificación, veremos
que el 7. ü bit nunca es utilizado; el
código más alto, 127, corresponde
en binario a 01000000.
De momento esto supone ya un
cierto derroche de memoria, aun¬
que no en grandes cantidades, al es¬
tar cada dirección de la RAM com¬
puesta por 8 bits.
Se podría hacer una rutina que
aprovechara al máximo esos 8 bits
(ya veremos más adelante cómo se
hace) utilizando el juego entero de
caracteres pero no merece la pena
ya que sólo nos ahorraríamos un by¬
te por cada 8. Es decir, que utilizan¬
do solamente 7 bits para cada carác¬
ter, lograríamos almacenaren 35 Kb
de memoria 40960 caracteres. De to¬
das maneras, supondría ya un aho¬
rro de 5120 bytes, pero somos muy
«agarrados» y queremos exprimir
nuestro paciente SPECTRUM has¬
ta límites insospechados.
Mutilación del juego
de caracteres
Con nuestra manía de ahorrar,
vamoa a ver ahora que tal nos iría
empleando para cada carácter sola¬
mente 6 de los 8 bits que conforman
su código.
Lo primero que deducimos con¬
siste en que el juego de caracteres
quedaría reducido a 64 combinacio¬
nes diferentes (entre 0 y 63 deci¬
mal). Tomemos el manual del orde¬
nador y consultemos el apéndice A
(tabla del juego de caracteres). Si
contamos los 64 caracteres disponi¬
bles a partir del código 32 (espacio),
veremos que podemos disponer de
todos los números, letras mayúscu¬
las y signos más importantes. Las
minúsculas quedarían excluidas pe¬
ro lo que nos queda es más que sufi¬
ciente para emplearlo en un peque¬
ño procesador de textos sin grandes
ambiciones estéticas. La imposibili¬
dad de utilizar las letras minúsculas
se compensa por el hecho de que
nos vamos a ahorrar un byte por cada
4 caracteres. ¡Siguiendo con el mis¬
mo ejemplo, en 35 Kb de memoria
podremos almacenar hasta 47786
caracteres! Conseguiremos eludir a
la «Hacienda» de nuestro ordena¬
dor 16946 bytes netos.
Todo esto está muy bien, pensará
el lector, ¿pero cómo es posible al¬
macenar 4 caracteres en tres bytes?
Esto es lo que veremos a continua¬
ción.
Un carácter y un tercio
en un byte
Si el Z-80 tuviera una configura¬
ción de 6 bits no habría ningún pro¬
blema para lo que queremos hacer
(pero repercutiría gravemente a la
hora de programara! ofrecer un jue¬
go de instrucciones menor). El
asunto está en aprovechar los 8 bits
de cada una de las localizaciones de
memoria para que pueda caber un
código (el cual estará formado por 6
bits) y una parte de otro. La figura 1
muestra cómo puede conseguirse
este fin. De esta manera, por cada
tres grupos de bytes en memoria, lo¬
gramos empaquetar 4 caracteres. El
primer byte del grupo contiene un
carácter completo más un tercio del
siguiente. El segundo, dos tercios
del segundo carácter y dos tercios
del tercero, y el tercer byte un tercio
del tercer carácter más el cuarto ca¬
rácter completo. Para entendernos
con las explicaciones que vendrán
seguidamente vamos a llamar a este
grupo comprimido de caracteres
«paquete».
Compensión/codificación
Habíamos quedado en que sola¬
mente utilizaríamos los caracteres
cuyos códigos están comprendidos
entre 32 y 95. Aparentemente esto
supone un ligero problema, ya que
Compresión de textos
entonces deberíamos emplear 7 bits
para cada carácter. El problema deja
de existir si cambiamos la codifica¬
ción. Al operar con sólo 64 caracte¬
res, podríamos muy bien asignar el
código 0 para el primer carácter de la
lista y 63 para el último. En la prácti¬
ca, la rutina resuelve esto restando
32 del código ASCII antes de proce¬
der a su tratamiento.
La rutina codificadora utiliza un
buffet cuya dirección está contenida
en la etiqueta START (esta direc¬
ción la puede variar el usuario «po-
keando» en las direcciones 65002 y
siguiente). En este bufi'er es donde
se va a almacenar cada una de las pá¬
ginas de texto que queremos com¬
primir. Una vez terminada una pági¬
na de texto (que consta de 672 by¬
tes, es decir, una pantalla completa),
se procede a su compresión. Reali¬
zada su tarea, la rutina codificará la
página en 168 paquetes de 3 bytes
(504 bytes) a partir de la dirección
contenida en la etiqueta TEXTO
(dirección 65000 y siguiente). En es¬
ta dirección, al utilizar por primera
vez la rutina, el usuario deberá mar¬
car en formato de dos bytes la direc¬
ción de inicio del texto comprimido.
Cada vez que se vayan codificando
Por cada tres grupos
de bytes en memoria,
logramos
«empaquetar» cuatro
caracteres.
más páginas de texto, el contenido
de START se irá incrementando en
504.
Rotaciones e instrucciones
lógicas
La filosofía de la rutina se caracte¬
riza por el empleo constante de las
instrucciones lógicas (AND y OR) y
las rotaciones. El programa toma el
primer byte de la dirección cocnte-
nida en la etiqueta START, le resta
32 a su contenido y realiza dos rota¬
ciones a la izquierda (RLCA) de tal
forma que el formato binario del có¬
digo se sitúe en el extremo izquier¬
do del byte. Seguidamente se acce¬
de al contenido de la siguiente di¬
rección, se le resta igualmente 32 y
se procede a una operación AND
para poner a 0 los bits 0,1, 2 y 3 de)
byte en cuestión (AND 00110000)
preservando el contenido de los bits
4 y 5. Inmediatamente se realizan
cuatro rotaciones a la derecha (RR-
CA) para colocarlos en el extremo
derecho. Después de recuperar el
anterior byte tratado que había que¬
dado a salvo en el Stack, una opera¬
ción OR hace que se mezclen en un
mismo byte aquellos 6 bits con los
dos de ahora. El resto del programa
se basa en acciones similares, hasta
haber formado un paquete. Un bu¬
cle condiciona] hace que se repita la
misma operación 168 veces (168x4
=672 caracteres) gracias al contador
situado en la etiqueta CONTA. Una
vez terminado todo el proceso, la
etiqueta TEXTO contiene ya la si¬
guiente dirección a partir de donde
se almacenará la siguiente página
comprimida.
Decodificación e
impresión
La rutina anterior no serviría de
nada sí no se dispusiera de otra que
decodificara los caracteres compri-
1 REM ORLANDO ARAUJO MARTIM
2 REM PRUEBA COMPRESOR
3 REÍ1 22 JUNIO 1986
4
5 GO SUB 900
9 LET START-290OO
12 LET TE X T □=300 OO
19 POKE 65001,1NT <TEXTO/256):
POKE 65000,TEXTO—íINT (TEXTO/25
6 >*256)
20 POKE 65003,INT (START/256):
POKE 65002,START-(INT ÍSTART/25
6>*256)
400 POKE 23728,32; LET N=Q
500 RANDOMIZE U5R 65189
510 RAND0MI2E ÜSR 65008
525 BO SUB 720
605 LET r-PEEK 23728; LET r=r + 1
: POKE 2372B,r
610 IF PEEK 2372S-96 fHEN GO T
0 700
630 LET N=N+1; 60 Tü 500
700 CLS : PRINT 11 QUE FAGINA DES
EA CONSULTAR?" : 1NPUT "
710 IF N<O OR N>63 THEN 30 TO
700
711 80 SUB 720
713 PAUSE Oí CLS ? GO TO 700
720 LET PAG=TEXTO+ (N*5Q4) : POKE
65007,INT (PAG/256): PÜKE 65006
t PAG-UNT (PAB/256 ) *256 ) ; RANDOM
IZE U8R 65099
725 RETURN
900 LET con-O: FOR i-65000 TO 6
5187i READ ai LET con-con+a: FOK
E i ,a? NEJíT i
910 IF con<>23575 THEN PRINT
FLASH 1;"ERROR EN DATAS RUTINA C
OMPRESÜRA": STOP
920 REM cargador tzndigos
921 RESTORE 2000: LET con=G: FO
R 1=65189 TO 65212; READ a: LET
con E con+áü POKE i,a
922 NEXT i
923 IF con<>2361 THEN PRINT
rror en datas cargador códigos' 1 2 3 4 5 6 :
STOP
950 REIURN
1001 DATA 40,119,72,113,0,0,48,1
17,1,168,0*237,67,236,253,42,234
,253,237,91,232,253,126,214,32
1002 DATA 7,7,245,35,126,214,32,
230,48,15,15,15,15,193,176,18,19
,126,214,32,230,15,7,7,7
1003 DATA 7,245,35,126,214,32,23
0,60,15,15,193,176,18,19,126,214
,32,15*15,230,192,245,35,126,214
1004 DATA 32,193,176,18,19,35,23
7,75,236,253 1 11,237,67,236,253 1 1
21,184,32,184,237,83,232,253,201
,205
1005 DATA 107,13,62,2,205,1,22,4
2,238,253,17,168,0,126,245,230,2
52,15/15,198,32,229,213,215,209
1006 DATA 225,241,230,3,7,7,7,7,
245,35,126,230,240,15,15,15,15,1
93,176,198,32,229,213,215,209
1007 DATA 225,126,230,15,7,7,245
,35,126,230,192,7,7,193,176,19B,
32,229,213,215,209,225,126,230,6
3
1008 DATA 198,32,229,213,215,209
,225,35,27,122,187,32,181
1009
2000 REM datos cargador codtgas
2100 DATA 22,21,58,176,92,95,42,
234,253,6,32,115,35,16,252,6,32
2110 DATA 21,122,254,0,32,244,20
1
1 ;ORLANDO ARflUJO MARTIN
2 ;CODIFICADOR TEXTO
3 ;17 de junio de Í9B6
4 3
5 ?
6 TEXTO EQU ¿5000
7 START EQU 65002
8 CONTA EQU 65004
9 PAG EQU 65006
10
11 QRG 65008
12 ENT *
13 LD BC,16B
14 LD (CQNTA) t EC
15 ;contador caracteres
16 LD HL,(START)
17 ¡¡dirección comienza buffer
te^ta a codificar
1S LD DE,(TEXTO)
19 ;carga en DE la dirección
actualizada te^íto a codificar
20 BUCLE LD A,(HL)
21 SUB 32
22 ;carga en A el codigo del
primer carácter del grupo
23 RLCA
24 RUCA
25 ;2 desplazamientos a la íz
quierda del carácter
26 PUSH AF
27 INC HL
28 ;acceso al siguiente carac
ter del buffer
29 LD A,í HL)
30 SUB 32
31 ;carga del carácter
32 AND X00110000
33 jse toman los dos últimos
bits del carácter
34 RRCA
35 RRCA
36 RRCA
37 RRCA
38 ;y se desplazan hacia la d
erecha *
39 POP BC
40 ;recuperadon del primer c
racter
41 ÜR B
42 ;mezcla de las 6 bits del
primer carácter con los
43 ;dos primeros del segundo
44 LD (DE),A
45 ;y se almacenan al estar y
a codificados
46 INC DE
47 ; acceso a la siguiente d¡ir
eccion del tes^to codificado
48 LD A,ÍHL)
49 SUB 32
50 ;se vuelve a tomar el segu
ndo carácter
51 AND 7-000011 i 1
52 ;considerando solamente lo
s cuatro primeros bits
53 RLCA
54 RLCA
55 RLCA
56 RLCA
57 j,para rotarlos a la izquie
r da
5B PUSH AF
59 INC HL
60 LD A,(HL)
61 SUB 32
62 * acceso y carga al tercer
carácter
63 AND 7.00111100
64 ;tomando en consideración
los cuatro últimos bits
65 RRCA
66 RRCA
67 ;2 rotaciones a la derecha
68 POP BC
69 OR B
70 ¡recuperación de los 4 pri
meros bits del segundo ca-
71 ;racter y mezcla con 1 os 4
últimos del tercero
72 LD (DE),A
73 ;y almacenamiento del conj
unto
74 INC DE
75 LD A, (HL í
76 SUB 32
77;acceso de nuevo al tercer
carácter
78 RRCA
79 RRCA
80 ;2 rotaciones a la derecha
del carácter
8 i AND 7.11000000
82 ;se salvan los das primero
s bits del carácter
83 PUSH AF
B4 I NC HL
85 LD A, (HL)
86 SUB 32
87 ;acceso al cuarto carácter
88 POP BC
89 OR B
90 ;y mezcla con los dos prim
eros bits del anterior
91 LD (DE) T A
92 INC DE
93 :almacenarniento del tercer
codigo del grupa
94 INC HL
95 LD BC.ÍCONTA)
96 DEC BC
97 LD (CONTA),BC
98 LD A,C
99 CP B
100 JR NZ,BUCLE
101 LD (TEXTO) ,DE
102 RET
103
104 i RUTINA DECQDIFICADDRA
105
106 CALL #0D6B
107 ;borra pantalla
108 LD A,2
109 CALL #1601
110 ;abre canal 2
111 LD HL, (PAB >
112 ;pagina elegida
113
LD
DE,168
114
;contador caracteres
115 1
LQOP LD
A,EHL)
116
PUSH
AF
117
AND
7.11111100
118
RRCA
119
RRCA
120
ADD
A,32
121
PUSH
HL
122
PUSH
DE
123
RST
#10
124
PDP
DE
125
POP
HL
126
PDP
AF
127
AND
7 . 00000011
128
RLCA
129
RLCA
130
RLCA
131
RLCA
132
PUSH
AF
i 33
INC
HL
134
LD
A,tHL)
135
AND
7.11110000
136
RRCA
137
RRCA
í 38
RRCA
139
RRCA
140
POP
BC
141
OR
B
142
ADD
A ,32
143
PUSH
HL
144
PUSH
DE
145
RST
#10
146
POP
DE
147
POP
HL
140
LD
A,(HL)
149
AND
7.000011 11
150
RLCA
151
RLCA
152
PUSH
AF
153
INC
HL
154
LD
A, í HL)
155
AND
7.1 ÍOOOOOO
156
RLCA
157
RLCA
158
POP
BC
159
OR
B
160
ADD
A ,32
161
PUSH
HL
162
PUSH
DE
163
RST
#10
164
POP
DE
165
POP
HL
166
LD
A, £HL)
167
AND
7.00111111
168
ADD
A , 32
169
PUSH
HL
170
PUSH
DE
171
RST
#10
172
POP
DE
173
POP
HL
174
INC
HL
175
DEC
DE
176
LD
A, D
177
CP
E
178
JR
NZ * LOOP
179
RET
Compresión de textos
1i BYTE ¡ Si BYTE ¡ 3!BYTE
i i
n
CARACTER
¿¡¡CARACTER
^CARACTER
1 t -k—j-i-
ÜCHRRCTER
EHPhüUEThMIENTO ¡DE CUhTRÜ
CRRfiCTERES (CON FQRMñTQ
DE 6 BITS) EN TRES BYTES.
midos y los imprimiera. Gracias a
ella podremos acceder a una página
cualquiera del texto y ver su conte¬
nido.
Como cualquier rutina de impre¬
sión, ésta comienza llamando a la
rutina del sistema operativo
OD6BH que limpia la pantalla y se
abre seguidamente el canal 2 de im¬
presión. En el registro HL se alma¬
cena la página que deseamos con¬
sultar, cuyo dato está contenido en
la etiqueta declarada al comienzo
del programa; PAG. En esta direc¬
ción (65006), antes de llamar a la ru¬
tina decodificadora, el usuario debe
almacenar en formato de dos bytes
la dirección de inicio de la página a
consultar. Por supuesto, para hacer
las cosas más fáciles, en ei programa
BASIC que controle la rutina, sólo
deberá introducirse el número de pá¬
gina mediante un INPUT (siendo 0 la
primera página). Un sencillo cálculo
en una línea BASIC se encargará
de calcular la dirección a la que co¬
rresponde la página según el dato
introducido y POKEará los datos re¬
sultantes a partir de la etiqueta
PAG.
En DE colocamos el contador
que ¡nicializamos a 168 (168x3=504
bytes a decodificar). Se toma el pri¬
mer byte de la página eliminándose
el contenido de los dos primeros bits
(AND 11111100). Se rota el byte dos
posiciones a la derecha y se le suma
32 a su contenido. De esta manera
conseguimos obtener el código AS¬
CII original. Ahora ya no tenemos
mas que imprimirlo aprovechando
lallamadaala ROM RST 10H. ¡Pero
cuidado! Siempre, antes de llamar
una rutina ROM, debemos preser¬
var el contenido importante de los
registros que estemos utilizando en
la rutina. En este caso, debemos de
poner a salvo HL (puntero del texto
comprimido) y DE (contador del
bucle) y llamar inmediatamente a la
rutina de impresión que imprimirá
en la pantalla el código contenido
en A. Entonces ya podemos volver a
recuperarlos del Stack mediante
POP. El resto del programa es seme¬
jante al anterior por lo cual no nos
alargaremos demasiado. Al igual
que aquél, se hace uso de las ins¬
trucciones de rotación y las opera¬
ciones lógicas. Una vez realizada
una pasada dentro del bucle, se ha¬
brán imprimido 4 caracteres que an¬
teriormente estaban firmemente
compactados en un paquete de tres
bytes.
Las presentes rutinas en
código máquina han sido
diseñadas para poder
rellenar (Fifi) cualquier
figura con posibilidad de
utilizar entramados
definidos por nosotros.
Ocupan un total de 415
bytes, no son reubicables
y han sido situadas juntas
a partir de la dirección
64900 (para dejar sitio a
los UDGs). Estas rutinas
son la coloreadora
propiamente dicha y la
rutina entramadora.
miíL
5.2 Y
PUNTOS POR LOS QUE VA PASANDO
LA RUTINA QUE RELLENA LA LINEA
La rutina coloreadora se utiliza
definiendo una función de la forma:
DEF FN n(a,b,c)=USR Ó49ÜÜ
y llamándola con una orden como:
LET a=FN n(X,Y,cc)
siendo n el nombre de la función, X
e Y las coordenadas de un punto
cualquiera en el interior de la figura
a colorear, y cc una condición. Si cc
vale 1, entonces además de colorear
se crea una tabla especial e impres¬
cindible si se desea luego utilizar al¬
gún tipo de entramado. Si ce vale 0
no se crea esta tabla ahorrando me¬
moria (la tabla ocupa una gran can¬
tidad de memoria) y permitiendo al
uso de la rutina en programas largos
o bien en máquinas de 16K —con el
previo ajuste de la rutina y reubica¬
ción de la misma.
Esta tabla se crea desde el co¬
mienzo de la rutina (dirección
64900) hacia abajo. En caso de que
la tabla bajara más allá del RAM-
La tabla utilizada para el
entramado ocupa mucha
memoria , por lo que en
Spectrum 16 K debe
suprimirse.
TOP se provocaría el error “out of
memory”. Por tanto debemos pre¬
viamente introducir una orden
CLEAR nn, dejando el espacio ne¬
cesario a la tabla. En caso de usar la
opción de no creación de la tabla
(cc=0) no debemos preocuparnos
de esto último.
Además, la rutina devuelve al
BASIC en eJ registro doble BC el
número de puntos que han sido
PLOTeados. Así, si ejecutamos la
orden:
LET a=FN n(X,Y,cc)
en la variable a tendremos el núme¬
ro de los puntos que «caben» dentro
de la figura.
Esto puede ser útil —a parte de la
mera curiosidad— para calcular, por
ejemplo, la superficie de cualquier
«cosa» por complicada que sea con
sólo dibujarla en la pantalla y colo¬
rearla; en ese caso la superficie ven¬
dría dada en «pixels cuadrados» que
en función de la escala se podrían
pasar a las unidades que fueran ne¬
cesarias.
Otra curiosidad es que el rellena¬
do de una figura puede ser parado
en cualquier momento pulsando la
tecla «SPACE». Esta parada será
siempre tras el relleno de una línea
completa de la figura. El resto de las
funciones, como la posibilidad de
uso de entramados o la cuenta del
número de puntos rellenados, fun¬
cionarán igual que si la figura se ter¬
minara allí.
La rutina entramadora se utiliza
también definiendo una función de
la forma:
¡m iMí&Mm
DEF FN n(a)=USR 649)4
y llamándola con una orden como:
LET a=FN n(dir))
siendo dir la dirección donde se ha¬
lla situado el entramado dentro de la
memoria. El entramado es un gráfi¬
co de 16 x 16 pixels que por tanto
ocupa un total de 32 by tes. Este grá¬
fico se almacena en memoria por fi¬
las de 16 bits, siendo la primera fila
la que se define de izquierda a dere¬
cha por los dos primeros bytes; los
dos siguientes definirían la segun¬
da, los dos siguientes la tercera y así
sucesivamente.
Como mucha gente no está habi¬
tuada a esta forma de almacenar los
gráficos, se dispone también de la
posibilidad de utilizar los UDGs A,
B, C y D para definir el entramado.
En este caso la figura estaría forma¬
da por estos cuatro gráficos siendo
la mitad superior la formada por los
gráficos A y B y la mitad inferior la
formada por los gráficos C y D. Si se
El entramado puede
definirse usando los UDG A,
B,CyD. Si se elige esta
opción, la rutina lo adapta
al otro formato.
elige esta opción, la dirección que se
debe indicar como inicio del gráfico
es la 0, encargándose la rutina de
adaptar el gráfico al otro formato de¬
positándolo en la memoria interme¬
dia de la impresora. Así, si se desea
adaptar un gráfico del formato
UDGs al otro bastará con entramar
una figura pequeña o bien introdu¬
cir el siguiente POKE:
POKE 64899,255
de esta forma no se entramará nada,
realizándose sólo el proceso de
adaptar el gráfico. Una vez hecho
esto (con el parámetro tf/r=0) basta¬
rá con trasladar esos 32 bytes que
forman la figura a donde convenga.
A diferencia de la otra rutina, la
entramadora no retorna en BC el
número de puntos, por lo que el va¬
lor de la función no tendrá ningún
sentido. Añadir además que se pue¬
de cambiar el entramado cuantas
veces se quiera mientras no se des¬
truya la tabla coloreando una nueva
figura con la opción ce=l.
Funcionamiento
El funcionamiento de las rutinas
es algo complejo por lo que aconse¬
jo, a los que quieran «atreverse» con
el listado ensamblador, que primero
lean estas líneas.
A) El funcionamiento de la rutina
coloreadora es simple en teoría,
aunque se complica un tanto en el
listado ensamblador.
Para colorear la figura se utiliza
un STACK que sirve para guardar
las coordenadas de las zonas o
líneas que se dejan para «más ade-
TABLA DE POKES:
(Para ahorrar entramados)
Figura Normal
POKE 65220,31
Figura Horizontal
POKE 65220,23
Figura Normal POKE
65263,122
POKE 65264,144
Espejo Vertical
POKE 65263,120
POKE 65264,146
lante» mientras se colorea otra zona
distinta. Como STACK se usa el del
Z-80 con órdenes tan simples como
PUSH o POP.
Para seguir el proceso hay que te¬
ner presente las figuras.
1. Se comprueba si el punto en las
coordenadas actuales está alzado
{POINT (x,y>—1). En caso afirmati¬
vo la zona en cuestión no tendría
nada que colorear, por lo que se pa¬
saría a la siguiente zona.
2. Se busca el límite derecho de la
línea a colorear (ver fig. 1).
3, A continuación se introduce en
la tabla (si la condición cvale 1) la
coordenada Y y la coordenada X fi¬
nal (del límite derecho).
Esta tabla está formada por gru¬
pos de 3 bytes, siendo el primero la
coordenada Y y el segundo y tercero
las coordenadas Xf¡ na l y X¡ n ¡ c ¡ a i res¬
pectivamente. Caso de que la coor¬
denada Y sea 255 (imposible) se to¬
ma como final de la tabla por la ruti¬
na entramadora, siendo esta la se¬
ñal.
Esta tabla se completa introdu¬
ciendo el tercer byte cuando se ter¬
mina el rellenado de una línea.
4. A continuación se inicia el re¬
llenado de la línea (de derecha a iz¬
quierda). Primero se PLOTea en las
coordenadas actuales y luego se
comprueban los puntos inmediata¬
mente inferior y superior. Si no hay
nada (POINT (x,y)=0), entonces se
almacenan en el STACK las coorde¬
nadas de ese punto (vacío) y se acti¬
va o alza un banderíz. Este banderín
evita que el STACK se llene de
coordenadas innecesarias para el
completo rellenado de la figura. Pre¬
viamente a la introducción de las
coordenadas en el STACK se com¬
prueba este banderín y si está alzado
no se realiza la introducción.
En caso de que el punto esté alza¬
do, entonces se baja dicho banderín
porque esto quiere decir que puede
venir a continuación una nueva zo-
La rutina entramadora se
limita a leer la tabla creada
por la otra rutina y poner o
quitar los puntos
correspondientes.
na (ver fig. 2). Esta comprobación se
realiza tanto en la zona superior co¬
mo en la inferior, pues puede suce¬
der en ambas lo mismo.
Cuando se termina de rellenar
una línea repitiendo el mismo pro¬
ceso y decrementando la coordena¬
da correspondiente, se pasa a una
nueva zona. (Una línea se completa
al encontrar un punto alzado o bien
el borde de la pantalla).
Para pasar a una nueva zona o
línea, se ponen a cero los banderi¬
nes y se sacan del STACK las nue¬
vas coordenadas. Hecho esto se
comprueba si estas coordenadas son
la señal previamente introducida
antes de comenzar a rellenar la figu¬
ra. Sí lo son, se retorna al BASIC de¬
volviendo el número de puntos
PLOTeados; si no, se vuelve a ini¬
ciar el proceso de rellenado de una
línea. Fíjese el lector que cuando se
comprueba durante el rellenado de
una línea si los puntos superior e in¬
ferior están a 0, si es necesario se in¬
troducen las coordenadas de dicho
punto en el STACK; por lo que al
QLHARD
TODO PARA SU QL
• RAM DI SC
• AMPLIACIONES DE MEMORIA
• UNIDADES DE DISCO
• EPROM CON TOOLKIT PARA
M. PERIPHERIAL
• SOFTWARE
Escribir s ApTDO 37165 BARCELONA
Llamara Tel.: (93) 321 27 25
PROGRAMAS PARA QL
Juegos, Utilidades y comerciales, gran variedad,
50 títulos a 2.500/3.500 ptas. También programas
para ATAR! 520/1040. __
Ordenadores Sinclair OL con garantía y 9
programas variados 43-900 pías
ATARI 520 ST c/ Monitor FV - Disco Ratón y
programas 1 51 350 pías
ATAftr 1040 c/ Monitor FV * Pisco Ratón y
programas 204 900 pías
ATARI 1040 cf monitor color - 01 seo Ratón y
programas 222.750 ptas. (precios sin IVA)
_ ENVIOS CONTRA REEMBOLSO _
VALENTÉ computación
Santa Engracia, &&2SQ1Q Madrid Tel.; 445 32 B5
Solicite GRATIS Boletín rntormativo
«i»
sacar las nuevas coordenadas del
STACK se continúa en la línea que
previamente había sido detectada
como vacía y n es necesario que la
rutina se encargue de subir o bajar
una línea para seguir rellenando.
Como curiosidad, puede decir
que si la rutina colorea primero de
arriba a abajo, es porque en el
STACK se introducen primero las
coordenadas de los «huecos» que se
detectan debajo, y luego los de arri¬
ba. Por ello, como el STACK es de
tipo LIFO (last in, first out), las últi¬
mas coordenadas son las superiores.
B )El funcionamiento de la rutina
entramadora se limita a leer la tabla
creada por la otra rutina y poner o
quitar los puntos que corresponda,
siendo esto lo más complicado, por
lo que paso a explicar cómo se sabe
si se debe poner o quitar un punto.
Para empezar, se loma como ori¬
gen de entramados las coordenadas
del punto desde el que se comenzó a
colorear la figura. Las fórmulas que
se usan para saber qué punto se de¬
be comprobar en el entramado para
luego ser copiado en pantalla son las
siguientes:
x - (CXorigen - CX) MOD 16
Y = (CY origen - CY) MOD 16
CXcmgeri CX o CY or ¡g eT1 —CY pue¬
den ser negativos, pero como en có¬
digo máquina los números negati¬
vos se expresan como complemento
a dos, ni se tiene en cuenta. Veamos
un ejemplo:
Tenemos un entramado cual¬
quiera (fig. 3) y queremos saber qué
le corresponde a un cierto punto
PROTEJA SU SPECTRUM PLUS CON ESTA
PRACTICA FUNDA
A UN PRECIO ESPECIAL
OFERTA LIMITADA
Y EXCLUSIVA PARA
NUESTROS LECTORES
Aproveche ía oportunidad de mantener
como nuevo su Spectrum Plus
con esta funda, y beneficíese
de un 30% de descuento
sobre su precio normal.
miijmvwm.
10
0RG
64000
520
PUSH
BC
1030
LD
A, C
20
FILL
LD
IX,<23651)
530
LD
A,(INCX)
1040
CP
255
30
LD
B,(IX+3)
540
LD
D, A
1050
JR
NZ,F_SIG5
40
LD
C,<IX+2)
550
LD
A, B
1060
RET
50
FILL2
PUSH
BC
560
SUB
D
1070
F _8165
LD
A, 1
60
LD
A,2
570
LD
B, A
1080
LD
(INCY),A
70
CALL
#1601
580
CALL
PÜINT
1090
PUSH
BC
80
LD
IX 7 FLAGS
590
POP
BC
1100
LD
A,(INCX)
90
LD
A,1
600
JR
NZ,F BUC2
1110
LD
D, A
100
LD
(INCY), A
610
BIT
1,(IX+O)
1120
LD
A, B
110
LD
íINCX),A
620
JR
NZ,F BUC3
1130
SUS
D
120
BC,65367
630
SET
1,(IX+O)
11 40
LD
B, A
130
LD
(STACK),BC
640
CALL
PUSH
1150
CALL
POINT
140
LD
BC,65535
650
JR
F_BUC3
í J60
POP
BC
150
CALL
PUSH
660
F_PT02
SET
0,<IX+0)
1170
JP
NZ ,F_BUC1
160
PDF
BC
670
DEC
c
1180
LD
A,(INCX)
170
F
_BUC1
LD
(COI ,8C
660
LD
A, 255
1190
LD
D, A
180
RES
0,<IX+Ü>
690
LD
íINCY),A
1200
XGR
A
190
CALL
PLOT
700
LD
(CC1),BC
1210
SUB
D
200
F
BLIC2
RES
1,(IX+O)
710
LD
BC,(CC)
1220
LD
(INCX),A
210
F
_BUC3
LD
A,íINCY)
720
JR
F_BUC2
1230
JP
F BUC1
220
ADD
A, C
730
F_PT03
BIT
3, ( IX+O)
1240
PÜINT
LD
A, #7F
230
LD
C,A
740
JR
NZ,F_BUC5
1250
IN
A,(#FE)
240
CALL
PDINT
750
SET
3,(IX+O)
1260
AND
1
250
JR
Z,F_PTQ1
760
CALL
PUSH
1270
JR
NZ,P_SIG2
260
BIT
0,CIX+O)
770
JR
F_BUC5
1280
RST
8
270
JR
Z,FPTQ2
780
PUSH
LD
HL ,(STACK)
1290
DEFB
12
200
LD
A,tINCX)
790
LD
DE,ZF IN
1300
P_SIG2
PUSH
BC
290
ADD
A,B
000
INC
DE
1310
CALL
#22AA
300
LD
B, A
810
PUSH
HL
1320
LD
B, A
310
INC
C
820
AND
A
1330
INC
B
320
LD
(CC2),BC
830
SBC
HL, DE
1340
LD
A,(HL)
330
LD
BC, ÍGCD
B40
POP
HL
1350
PBUC1
RLC
A
340
RES
3,<IX+Ü)
850
JR
NZ,F_5IG3
1360
PJ NZ
P_BUC1
350
LD
A,(INCX)
860
F_ERft
RST
8
1370
AND
1
360
ADD
A, B
870
DEFB
3
1380
NDP
370
LD
B, A
080
FSIG3
LD
(HL),B
1390
NOP
380
F
_BUC4
CALL
PÜINT
890
DEC
HL
14Q0
POP
BC
390
JR
Z t F_PT03
900
LD
(HL>,C
1410
RET
400
RES
3,íIX+O)
910
DEC
HL
1420
PLOT
PUSH
BC
410
F.
„BUC5
LD
HL,<CC2)
920
LD
(STACK) f HL
1430
CALL
#22E5
420
AND
A
930
RET
1440
POP
BC
430
SBC
HL , BC
940
PQP
LD
HL,(STACK)
1450
RET
440
LD
A, H
950
INC
HL
1460
FLAGS
DEFB
0
450
0R
L
960
LD
C,<HL)
1470
INCX
DEFB
0
460
JR
Z ,POP
970
INC
HL
1480
INCY
DEFB
0
470
LD
A,(INCY5
900
LD
B, (HL)
1490
CC
DEFW
0
480
ADD
A, C
990
LD
(STACK),HL
1500
CC1
DEFW
O
490
LD
C, A
1000
LD
A, B
1510
CC2
DEFW
0
500
JR
F_BUC4
1010
CP
255
1520
STACK
DEFW
0
510
F.
_FTQ1
CALL
PLOT
1020
JR
NZ,FSIG5
1530
ZF IN
END
ORIGEN DE ENTRAMADOS
¡mu (ímmm
(59, 60) si el origen de entramados
está en {62,57). Para ello acudimos a
las fórmulas:
X = (62 - 59) MGD 16
Y = (57 - 60) MOD 16
siendo X=3 e Y=13 (si no le da esto
mire a ver si ha efectuado bien el
complemento a dos para números
negativos). Basta ahora con fijarnos
en el estado del punto con coorde¬
nadas (3, 13) en el entramado, y sa¬
bremos que le corresponde un 1.
(La X es la coordenada horizontal y
la Y es la vertical).
Esto es algo así como si conside¬
ráramos el entramado como si fuera
un baldosín y llenáramos con esos
' baldosines la figura. El origen de en¬
tramados es el punto de partida de
los baldosines. Este origen coincide
con el punto medio superior del
baldosín (fig. 5) que está debajo del
origen.
Si utilizáramos los UDGs A, B, C
Dado que la rutina
entramadora lee de la tabla
y no la destruye, se puede
cambiar el entramado
cuantas veces se necesite.
y D como entramado sin cambiar¬
los, veríamos algo asi como lo que se
aprecia en la figura 6 respecto al ori¬
gen de entramados.
Dado que la rutina entramadora
lee de la tabla y no la destruye, pode¬
mos cambiar el entramado cuantas
veces queramos hasta que se cam¬
bie la tabla para otra figura. (O se
anule ésta con el POKE anterior¬
mente mencionado).
Como ejemplo de lo dicho prueba
lo siguiente:
CIRCLE 127, 87, 85:
LET a=FN a (127, 87, 1)
(suponiendo que la función defini¬
da se llame a). Pruebe ahora:
LET a=FN b(dir)
(suponiendo que la función se llame
6); y procure que dir tenga un valor
dentro de la ROM. Podrá repetir es¬
ta orden cambiando dir cuantas ve¬
ces quiera.
Pruebe ahora dir= 15000. Podrá
ver que rellena por completo, pues
la dirección 15000 y siguientes están
dentro de «agujero negro» de la
ROM.
A los programadores que usen
muchos entramados les aconseja¬
mos que consultaran la tabla de PO-
KES, que los guardaran directa¬
mente en memoria y que los salva¬
ran al cassette en forma de BYTES
en lugar de crearlos en el propio pro¬
grama.
•*- -
Feo. Javier Ellees Vallejo
ROTACION
El mes pasado vimos cómo podía realizarse la inversión de gráficos
definidos por el usuario en dos sentidos diferentes (horizontalmente
y verticalmente). En el presente artículo trataremos un tema similar
aunque algo más largo de llevar a buen término que el anterior.
Con la rutina que vamos a desarrollar podremos orientar cualquier
UDG en cuatro direcciones diferentes, lo cual supone un ahorro
mayor que en el caso de la inversión.
S i ei mes pasado lográbamos ob¬
tener 2 UDGs a partir de uno,
con la actual rutina obtendre¬
mos 4 diferentes.
Este programa en Código Máqui¬
na permite orientar un UDG en 4 di¬
recciones distintas. El efecto conse¬
guido al llamar reiteradamente la
rutina es una rotación del UDG, ro¬
tación que puede conseguirse a vo¬
luntad tanto de derecha a izquierda
como de izquierda a derecha.
Una de las muchas utilidades que
pueden deducirse a primera vista
podría ser la simulación del movi¬
miento rotatorio de las ruedas de un
automóvil. En lugar de crear cuatro
gráficos diferentes, bastaría con
crear uno sólo y llamar a la rutina.
Así de sencillo. De igual forma, si
tiene pensado programar un «Co-
mecocos», no tiene más que limitar¬
se a crear una única figura del famo¬
so «cometan tasmas». Las otras tres
orientaciones del «pac-man» las irá
calculando la rutina por usted.
Existen otras muchas aplicacio¬
nes destinadas a juegos que con se¬
guridad irá descubriendo según sus
necesidades de programación.
La rutina utiliza cuatro
variables diferentes que
se almacenan en otras
tantas direcciones de
memoria
Ideas básicas de la
rotación
De la misma forma que comenza¬
mos en el anterior articulo, antes de
nada debemos imaginarnos el pro¬
ceso dejando a un lado el ordenador
y los fríos mnemónicqs Assembler,
ya que si no se tienen las ideas bien
claras, llegar a la solución del pro¬
blema, programando directamente,
puede ser un verdadero rompecabe¬
zas.
De inmediato nos encontramos
con un problema que ofrece dos si¬
tuaciones diferentes. Por un lado,
podemos rotar el UDG de derecha a
izquierda, y por el otro, de izquierda
a derecha. Estudiemos de momento
la primera situación.
Imaginemos un cuadrado dibuja¬
do en un papel dividido en 8x8 celdi¬
llas. Cada una de estas celdillas co¬
rresponden a los bits individuales de
cada una de las filas o bytes del
UDG. Numeramos secuencialmcn*
te cada una de las celdas del 1 al 64.
Seguidamente, damos un cuarto de
vuelta al papel (de derecha a iz¬
quierda). El siguiente paso consiste
en estudiar los cambios que han su¬
frido los bits del UDG para obtener
una regla común que será la que nos
permitirá llegar al futuro algoritmo
de rotación.
.
ROTACION DE
Esto es lo que descubrimos. El úl¬
timo bit de la primera fila ocupa la
í . a posición de la primera fila; el últi¬
mo bit de la segunda fila ocupa el se¬
gundo lugar de la primera fila; el úl¬
timo de la tercera, el tercero de la
primera, y así sucesivamente hasta
haber completado la primera lila.
Entonces, los siguientes bits que se
trasladan son los penúltimos de ca¬
da una de las 8 filas que se van des-
E1 programa fuente
La rutina hace uso de cuatro va¬
riables almacenadas a partir de otras
tantas direcciones de memoria. En
la dirección 59996, la rutina almace¬
na un número que según sea 0 ó 1,
accedemos a la rotación derecha-
izquierda o izquierda-derecha res¬
pectivamente. En las 59999, intro¬
ducimos el n.° de orden del UDG a
ción de! n.° del UDG que ya vimos
en el anterior artículo. Si la ejecu¬
ción es a partir de la dirección 60007,
se carga en la mencionada dirección
un 1 y el programa sigue su curso a
partir de START. Después de haber
procedido a la ya comentada multi¬
plicación por 8 (operación que sirve
para tener un acceso inmediato al
UDG elegido), un bucle LDIR car¬
ga a partir de la tabla salva una co-
plazando a los 8 lugares correspon¬
dientes de la segunda fila. El proce¬
so se repite hasta haber completado
la totalidad de las filas.
En el caso de que la rotación fuera
de izquierda a derecha, el proceso
sería inverso; el 1bit de la 8. a fila se
traslada al lugar que ocupaba el l.°
de la 1. a fila; el último de la 7. a fila va
al lugar dei segundo puesto de la pri¬
mera, etc.
Esta es la base teórica de nuestra
rutina. Teniendo presente estas
ideas, ya podemos pasar a realizar el
programa fuente sin grandes dificul¬
tades.
rotar (0 a 20). La dirección 59997 y
siguiente, la utiliza el propio progra¬
ma para almacenar el comienzo de
la dirección de una tabla a partir de
la cual almacenamos una copia de
los datos del UDG. Esta última di¬
rección será utilizada por el registro
índice IX.
La rutina puede llamarse de dos
formas diferentes. Si deseamos una
rotación derecha-izquierda, habrá
que ejecutarla a partir de la direc¬
ción 60000, almacenándose en la di¬
rección 59996 un 0 para saltar inme¬
diatamente a la etiqueta START
donde se procede a la multiplica-
pia del UDG para tener un mode
lo intacto con el cual puedan efec¬
tuarse las comparaciones. Para te¬
ner acceso a estos datos, vamos a
emplear el registro IX como punte¬
ro, con lo cual lo cargamos con la di¬
rección original contenido en salva
(líneas 30 a 32).
Seguidamente, cargamos de nue¬
vo HL con el comienzo de la direc¬
ción del UDG e iniciamos una serie
de contadores que nos servirán para
llevar a cabo los constantes bucles
dentro de los cuales se desarrollan
las comparaciones de cada uno de
los bits.
ROTACION DE W
1
;Orlando Araujo
41
LD D, 8
2
;ROTACION UDGs
42
;D=contador de los bytes d
3
;3 MAYO 1986
el UDG 1
4
43
5
44
BYTE LD B ,8
6
ORG
60000
45
;B=contandor de cada uno d
7
ENT
$
e los
bits de los bytes del UDG
8
LD
A, 0
46
BUC LD C,(IX+0>
9
LD
(59996),A
47
;Se carga en C el primer b
10
JR
START
ytes a
i comparar y tratar
11
;Rotación derecha-izquierd
48
LD A,(59996)
a
49
CP 0
12
LD
A,1
50
JR Z,BITD
13
LD
(59996),A
51
;Si se ha elegido la rotac
14
¡Rotación i
z quierda-derech
ion der/izq se salta a BITD
a
52
JR BITI
15
START LD
A,(59999)
53
¡Si no, a BITI
16
SLA
A
54
OTRA JR NZ,SETUP
17
SLA
A
55
VEZ INC IX
18
SLA
A
56
;Acceso al siguiente dato
19
LD
E,A
del UDG protegida
20
LD
D , 0
57
DJNZ BUC
21
LD
HL,(23675)
58
;Cuando B=0 se salta a BUC
22
ADD
HL, DE
para
tratar otro byte
23
;Acceso al
UDG elegido med
59
LD (HL),E
i ante
multiplicación por 8 de n.
60
;Se carga en la dirección
UDG
correspondiente del UDG
24
LD
(59997),HL
61
;el dato de-finitivo
25
LD
BC , 8
62
LD IX,(23728)
26
LD
HL,(59997)
63
;Se vuelve a reiniciali zar
27
LD
DE,SALVA
IX con la dirección
28
LD IR
64
;etiquetada SALVA
29
;Se almacena el UDG Qrigin
65
INC HL
al en
otra dirección para prateg
66
DEC D
er 1 o
67
LD E ,0
30
LD
HL,SALVA
68
LD A, D
31
LD
(23728),HL
69
RET Z
32
LD
IX,(23728)
70
JR BYTE
33
;En IX se guarda la dírecc
71
¡¡Salta para el siguiente d
ion del primer dato del
ato
o 4
;UDG protegido
72
BITD LD A,D
35
LD
HL,(59997)
73
CP 8
36
; Se carga en HL el comienz
74
JR Z ,BIT0
o de
la dirección
del UDG elegid
75
CP 7
o
76
JR Z,BITI
37
LD
m
O
77
CP 6
38
;Se inicializa a 0 el regi
78
JR Z,BIT2
stro ¡
E ya que va
a se el
79
CP 5
39
;que contendrá cada uno de
SO
JR Z,BIT3
los bytes resultantes
81
CP 4
40
;del UDG tratado
82
JR Z,BIT4
ROTACION DE
El primer byte a comparar (1. a fila
del UDG) se carga en C utilizando
¡X como registro índice (línea 46) y
seguidamente chequeamos el con¬
tenido de la dirección 59996 para lle¬
var a cabo el tipo de rotación elegi¬
do. Para no alargarnos excesiva¬
mente, vamos a ver únicamente la
rotación derecha-izquierda. Si se ha
elegido esta última opción, el pro¬
grama salta a BITD. A partir de esta
etiqueta se carga en A el contenido
de D, que inicialmente vale 8 (cada
vez que haya sido tratada una fila
del UDG, se irá decrementando).
Inmediatamente se compara el con¬
tenido de este registro con valores
comprendidos entre 8 y U. En este
caso, al ser el contenido de D=8, un
salto condicional desvía el progra¬
ma a la etiqueta BITO donde se com-
B3
CP
3
108
BIT 1
BIT
84
JR
Z,BIT5
109
JR
OTRA
95
CP
1 10
BIT2
BIT
2,C
86
JR
Z,BIT6
111
JR
□ TRA
87
CP
1
1 12
BIT3
BIT
3,C
88
JR
Z,BIT7
113
JR
□TRA
89
BIT I
LD
A, D
114
BIT4
BIT
4,C
90
CP
8
1 15
JR
OTRA
91
JR
Z,BIT7
116
BITS
BIT
5,C
92
CP
7
1 17
JR
□TRA
93
JR
Z,BIT6
1 18
BIT6
BIT
6 , C
94
CP
6
119
JR
OTRA
95
JR
Z,BITS
120
BIT7
BIT
7 , C
96
CP
5
121
JR
OTRA
97
JR
Z,BIT4
122
SETUP
LD
A, (59996)
98
CP
4
123
CP
0
99
JR
Z,BIT3
124
JR
Z,SETUP1
100
CP
3
125
JR
SETUP2
101
JR
Z,BIT2
126
SETUP1
LD
A , B
102
CP
2
127
CP
8
103
JR
Z , BIT1
128
JR
Z,SET7
104
CP
1
129
CP
7
105
JR
Z , BIT 0
130
JR
Z,SET6
106
BITO
BIT
0,C
131
CP
6
107
JR
OTRA
132
JR
Z,SET5
ROTACION DE
para el contenido del bit 0 de la fila
que estamos tratando. Un salto in¬
condicional (JR OTRA) hace que
nuestro programa vuelva hacia atrás
a la etiqueta especificada donde nos
encontramos con la instrucción JR
NZ SETUP. Si el resultado anterior
no ha sido cero (es decir, si el bit que
hemos examinado estaba alzado)
accedemos a la dirección etiquetada
por SETUP (donde volvemos de
nuevo a ver si estamos tratando la
rotación d/i o i/d). Como hemos
elegido la rotación d/i, saltamos a
SETUP) y allí chequeamos el con¬
tenido de B para saber qué número
de orden del bit se quiere alterar. De
esta manera, saltamos a SET7 don¬
de se alza el primer bit del byte con¬
tenido en E (que inicialmente vale
0). De esta forma ya hemos conse-
1.4“^
CP
5
158
CP
1
134
JR
Z,SET4
159
JR
Z , SET7
135
CP
4
160
136
JR
Z,SET3
161 SET7
SET
7, E
137
CP
3
162
JP
VEZ
13S
JR
Z,SET2
163 SET6
SET
6 ,E
139
CP
o
jL
164
JP
VEZ
140
JR
1 ,SET1
165 SET5
SET
5, E
141
CP
1
166
JP
VEZ
142
JR
Z,SETO
167 SET4
SET
4,E
143 SETUP2
LD
A , B
168
JP
VEZ
144
CP
8
169 SET3
SET
3, E
145
JR
Z,SETO
170
JP
VEZ
146
CP
7
171 SET2
SET
2, E
147
JR
Z,S£T1
172
JP
VEZ
148
CP
6
173 SET1
SET
1,E
149
JR
Z,SET2
174
JP
VEZ
150
CP
5
175 SETO
SET
0, E
151
JR
Z,SET3
176
JP
VEZ
152
CP
4
177 SALVA
153
JR
Z,SET4
178 ;En las 8 direcciones sigu
154
CP
"ÍT
lentes a SALVA se
guardan
155
JR
Z,SETS
179 ;los datos
del LíDG que se
156
CP
2
esta rotando
157
JR
Z,SET 6
3
ROTACION DE
1
2
3
4
S
6
7
5
3
12
£4
32
£3
£2
iL.
m
U
13
14
13
le
—J
í
13
£2
21
32
£7
i 2
12
¿jg
£1
g£
£3
24
uS
14
££
22
23
46
£2
£5
£7
£9
23
21
3 fe
12
£1
£2
3 2
£3
33
34 ,
35
22
37
22
29
4*
ü
£a
£2
23
44
íU
M
£2
44 .
£2
47
4£
3
Ü
12
£7
23
£2
49
50
53
£3
§£
3S
ia
3
£3
££
52
£3
£3
n
50
61
£2
fci
1
La
d
£3
£1
UDG ANTERIOR
64,
21
22
5J
22
U06 NUEUÜ
RANDOMIZE U5R 60000
(ROT 0 / 1 )
FIG. 3
(Situación de los bits tras un ouarto de giro)
UDG
ORIGINAL
l_t |_t I_ 1
RANDOMIZE RANDOMIZE RANDOMIZE
USR ©0000 USR 00000 USR ©0000
ROTRCION DERECHA/IZOUIERDA
III ■■■
III III
om
T)
tu rm
rnruxp
)C—--
L Ji iu\
le: .
"1
..¿uRT m
UDG
ORIGINAL
I_t í_t 1_ 1
RANDOMIZE RANDOMIZE RANDOMIZE
USR 60007 USR 60007 USR 60007
ROTACION IZQUIERDA/DERECHA
4
(ROTACION COMPLETA RE UN UDG)
guido el primer paso; el último bit
de la primera fila se traslada al lugar
del bit de la primera fila.
Y el ciclo se repite
Tras esta última operación, salta¬
mos incondicionalmente a la direc¬
ción etiquetada en VEZ donde in¬
crementábamos el registro IX (con
esto accedemos ya al siguiente Byte,
de cuál tendremos que comprobar
su último bit). La siguiente instruc¬
ción (DJNZ BUC) hace que se de-
cremente B en 1 y salte a BUC mien¬
tras su valor no sea cero. A partir de
BUC volvemos a repetir la misma
operación anterior, cargando en C
el contenido de IX + O que ahora ya
es el 2.° dato del UDG.
Una vez que B sea igual a O, quie¬
re decir que hemos examiando el
contenido de todos los últimos bits
de las 8 filas y trasladado su conteni¬
do ai registro E. Bien, pues este re¬
gistro se carga en la dirección conte¬
nida en HL (línea 59) y que corres¬
ponde a la dirección inicial del
UDG en esta primera parte de este
complicado bucle. Volvemos a car¬
gar en IX la dirección etiquetada en
SALVA, con lo cual se accede de
nuevo al primer dato del UDG (aho¬
ra se trata de comprobar el estado de
cada uno de los penúltimos bits de
las 8 filas del UDG). Entre las líneas
65 y 70, incrementamos HL para po¬
der escribir sobre la siguiente direc¬
ción del UDG; decrementamos el
contador de las filas (registro D),
iniciamos de nuevo el registro E a 0
y si no hemos completado todas las
filas, volvemos de nuevo a la etique¬
ta BYTE donde se reinicializa todo
el proceso.
Enrevesado. ¿No? A primera vista
sí lo parece, pero puede llegar a en¬
tender totalmente el proceso si si¬
gue el programa paso a paso con un
modelo de UDG como ejemplo.
Entonces podrá ver que a pesar de
su longitud, el programa es geniu-
namente sencillo, ya que no hace
ROTACION
QJJSXli
más que poner en práctica los fun¬
damentos que explicamos en nues¬
tro apartado anterior, «Ideas básicas
de la rotación».
El programa de
demostración BASIC
Si no dispone de un ensamblador,
debe hacer uso del programa BA¬
SIC que carga los códigos en la me¬
moria y que al mismo tiempo ofrece
una demostración de lo que es ca¬
paz de hacer.
Cuando desee utilizarla en un
programa propio, deberá grabarla
con SAVE “ROTAC10N”C0DE
60000,309 y cargarla posteriormente
(LOAD "’CODE). Después de ha¬
ber hecho lun CLEAR 56995, antes
de llamar a la rutina, se debe cargar
en la dirección 59999 en n.° de Or¬
den del gráfico a imprimir y poste¬
riormente RANDOMIZE USR
60000 ó RANDOMIZE USR 60007
según el sentido del giro que quiera
dar al gráfico. Finalmente, imprima
el gráfico. El método es similar al de
laya estudiada inversión de caracte¬
res.
Una mejora sustancial de la ruti¬
na consistiría en que rotara no sola¬
mente un gráfico, sino todo un blo¬
que de caracteres. Aquí ya no habría
que cambiar exclusivamente los bits
del carácter, sino también cambiar
las direcciones de los gráficos que
conforman el bloque. Sobre la base
de lo que ya hemos visto y si tiene
los suficientes conocimientos para
ello, puede intentar afrontar este
nuevo problema.
Orlando Ara ujo Martin
1 REM Orlando Araujo Martin
2 REM Cargador ROTACION
3 REM 13 Junio 1986
4
5
50 PRINT FLASH 1;AT 10,10;"CA
RGANDO CODIGO"
ICO LET CON=C
120 FOR 1=60000 TO 60309: READ
A
130 POKE I,A: LET CON=CON+A: NE
XT I
140 IF CQN< >32933 THEN PRINT 11
ERROR EN DATAS": STOP
150 REM DEMONSTRAS ION
160 REM
170 CLS
200 LET C0N=144: FÜR 1=144 TO 1
64: FOR N=0 TO 3: POKE 59999,144
-CON: PRINT CHR* I;*' "; : R ANDON I
2E USR 60000! NEXT N
210 LET CDN»CDN-1: PRINT : NEXT
I
250 PRINT INVERSE 1;AT 21,0;"D
ER./IZQ"
300 LET X =0: LET Y=15: LET CÜN=
144: FOR 1=144 TO 164: FOR N=0 T
O 3: POKE 59999,144-CON: PRINT A
T X,Y;CHR$ I: RANDOMIZE USR 6000
7: LET Y=Y+2: NEXT N
310 LET CON=CON-1: LET X=X+1: L
ET Y=15: NEXT I
350 PRINT INVERSE 1;AT 21,15;"
IZQ./DER."
1001 DATA 62,0,50,92,234,24,5,62
,1,50,92,234,58,95,234,203,39,20
3,39,203,39,95,22,0,42
1002 DATA 123,92,25,34,93,234,1,
8,0,42,93,234,17,145,235,237,176
-r-jr 143 ^^3 "^4 17 h ^21 4^
1003 DATA 176,92,42,93,234,30,0,
22,8,6,8,221,78,0,58,92,234,254,
0,40,21,24,52,32,115
1004 DATA 221,35,16,238,115,221,
42,176,92,35,21,30,0,122,200,24,
223,122,254,8,40,61,254,7,40
1005 DATA 61,254,6,40,61,254,5,4
0,61,254,4,40,61,254,3,40,61,254
,2,40,61,254,1,40,61
1006 DATA 122,254,8,40,56,254,7,
40,48,254,6,40,40,254,5,40,32,25
4,4,40,24,254,3,40,16
1007 DAT A 254,2,40^ 8,254,1,40,0,
203,65,24,167,203,73,24,163,203,
81,24,159,203,89,24,155,203
1008 DATA 97,24,151,203,105,24,1
47,203,113,24,143,203,121,24,139
,58,92,234,254,O,40,2,24,33,120
1009 DATA 254,8,40,61,254,7,40,6
2,254,6,40,63,254,5,40,64,254,4,
40.65.254.3.40.66.254
1010 DATA 2,40,67,254,1,40,68,12
O,254,8,40,63,254,7,40,54,254,6,
40.45.254.5.40.36.254
1011 DATA 4,40,27,254,3,40,10,23
4,2,40,9,254,1,40,0,203,251,195,
171.234.203.243.195.171.234
1012 DATA 203,235,195,171,234,20
3,227,195,171,234,203,219,195,17
1,234,203,211,195,171,234,203,20
3.195.171.234
1013 DATA 2*03,195,195,171,234,0,
O, O, O, O
PROGRAMA TU ORDENADOR PARA QUE
JUEGUE COMO UN MAESTRO
A unque las reglas y estrategias
del juego de las 3 en raya son
muy simples, conseguir que tu
ordenador juegue bien no es dema¬
siado fácil. En este artículo enseña¬
remos a tu ordenador a jugar a ga¬
nar, o como mucho a empatar,
Comparado con un jugador huma¬
no experimentado, la única debili¬
dad de este programa es su ocasio¬
nal pasividad; a veces se decidirá por
un empate cuando es posible obte¬
ner una victoria.
Además de enseñar a tu ordena¬
dor a jugar, el programa sirve como
ejemplo de tres técnicas que son
igualmente aplicables para desarro¬
llar programas de otros juegos más
complejos, como el ajedrez o las da¬
mas:
- Movimientos de apertura pre¬
parados.
— «Echar un vistazo», valorar las
consecuencias de un movi¬
miento, estudiando las posi¬
bles jugadas siguientes.
- Heurística, seleccionar movi¬
mientos acordes con principios
generales de estrategia.
Reglas y Estrategias
B Antes de explicar cómo funciona
el programa, revisaremos el objeto,
reglas y estrategias de este juego. Se
juega en una rejilla de 3x3 casillas,
Dosjugadores marcan una celda, al¬
ternativamente. El jugador que sale,
marca con una X, y el otro con O.
(Nos referimos a ellos de ahora en
adelante, como jugador X y jugador
O).
El primer jugador que coloque
tres marcas en una columna, fila o
diagonal gana. Si todas las celdas es¬
tán llenas sin que haya ganado nin¬
gún jugador se produce un empate.
Antes de empezar los subsiguientes
juegos, ambos jugadores intercam¬
bian el orden de salida, así el prime¬
ro pasa a ser el segundo y viceversa.
El nivel más bajo de estrategia en el
juego se compone de tres pasos (1)
si puedes ganar en tu siguiente tur¬
no, hazlo; (2) si tu oponente puede
ganar en el suyo, bloquea su acción;
(3) si no se dan ni (1), ni (2) ocupa
otra casilla libre.
No lleva mucho tiempo mejorar o
refinar el paso (3). La buena estrate¬
gia está basada en la trampa, una
marca que te da dos oportunidades
de ganar en tu siguiente jugada (grá¬
fico 1). Tu oponente sólo será capaz
de bloquear una de estas posibilida¬
des y así cuando te toque jugar de
nuevo, tendrás todavía una oportu¬
nidad de completar una raya.
Recíprocamente, para evitar per-
LISTHDO 1
55RAND0MIZE
10 CLS : BOEE 33658,8 PAPER 7 INK 0
30 Din JS( 2 , 8 >: DIM i<3,35.= Din 00,3
Ai 9 , 3 5 ■ DIH Gi 2 5 = Din C*í 3, 1 5 DI 11 Vi 2 5
35 LET VU>«*0‘ LET V<2 5*0 = LET JE* tí
40 FOR F»1 TO 3
50 FOR C=1 TO 3
60 REAO T<F,C >
70 NEXT C
80 NEXT F
30 DRTft 2, 3/2,3,1,3,2,3,2
160 FOR N-l TO 4
110 FOR V*1 TO 2
120 RERD D< H , V >
130 HEXT V
140 HEXT N
150 DRTA 0,1,1,1, 1,0,1, ~1
160 FOR W=1 TO 8
170 FOR Y-l TO 3 *
130 READ fl< W, Y >
130 HEXT Y
FLfiSH 0 * INVERSE 0 BRIGHT 0
Din T < 3,3 5 ! DIM Ji 2 5 ! DIM Di 4,2
200 HEXT U
210 DATA 1,1,1, 1, 1,2,1,1,3,1, 2 , 3,1 , 3 , 4 , 1 , 3 , 3 , 2 , 1 , 1 , 3 , 1 , 1
230 LET C*< 1 >=■■-"
240 LET C*<25-"X"
250 LET C$< 3)="0"
253 LET TES-0
254 PRINT "SI QUIERES QUE EL ORDENADOR JUEGE SOLO, INTRODUCE •' ", INK
CTRON” > INK 0, “ ‘ 11
255 INPUT "CON QUIEN VOY fl JUGAR "i LIME S*
256 IF LEN S*>8 THEN LET S**á«i 1 TO 8 5
257 LET LAR-LEH 8 *
258 IF S$="SPECTRON" THEN LET TE8=1.
260 LET J*< 1 >«SÍ
£70 LET J$C £ 5= " SFECTRUM "
280 LET Vil 5*0
290 LET V<2 5*0
300 LET JE*0
330 LET J< 15*1
340 LET JC2>=2
350 GÜ TO 398
DIM
2.5 "SPE
LISTñDO
36@>LET JS*J<1 5
370 LET Jil5=J<2>
380 LET Jí. 2 >=JS
400 CLS ! PRINT ÑT 1,0; INK 7; PñPEP 1;" - 3 EN RAYA -
405 PRINT RT 13,£;"SFECTRUM";RT 13,17-INT tLAR/2 >; Jíi15; AT 13,25; "EMPATES"
406 PRINT RT 8,16,"FILR COLUMNA"
407 PRINT RT 15,5; V< 25; AT 15,17; Vi 1 •>; AT 15,28 ; JE
410 LET NM=6
420 FOR F=1 TO 3
430 FOR C=1 TO 3
440 LET I<F,C>*0
450 NEXT C
460 NEXT F
LISTADO 3
470> LEI. NIT=Nt1+l
480 LET NR-1
430 LET R=1
500 GO SUB 2020
52© PRINT RT 5, 10 ;" JU EGA ■ ” ; INK -X NR >+íi J*< J< WR > ); INK 0;RT 5/25; "MRRCR "i INK
J\ NR >+l;C$CNR+l >
525 PRINT RT 10,1?.;"
530 IF JÍNR>*1 THEN GQ SUB 820+188*<TES=1>
535 IF ,K NR >~2 THEN GÜ SUB 1000
LISTADO *4
540> LET SL~3
550 LET ST=NR
560 GO SUB 2240
580 IF H>0 THEN GÜ TO 640
580 IF NM=6 THEN GÜ TÜ 730
600 IF NM-5 THEN GO TO 630
610 IF NR~£ THEN GO TO 470
620 LET HR-NR+1
630 GO TO 430
640 LET P-GÍ H)
650 GO SUB 2620
660 PRINT FlT 18,2; FLASH 1; INK 7; PAPER 1; “GANA " ; JSK JC. NP > 1 TO 8-< J<NR)=1
J ^ ; II | II
670 ' LET V< J( NR ) >-V< J< NR > >+ 1
680 GO TO 730
630 LET R=1
700 GO SUB 2028
716 PRINT RT 13,2; FLASH 1 } PAPER 1; INK 7;"EMPATE"
720 LET JE-JE+1 ‘
IM^spectrun
í
MADRID
( 91)7339662
LISTADO S
730 >
PRINT
RT
15,5; Vi 2 >; HT
15,. 17; Vi
1 >;
RT
15,28;.
JE
740
INPUT
"SEGUIMOS 0 LO
DEJAMOS <
SzTO "
; LIME
745
F'RINT HT
18.2;"
II
750
IF Hí=
: "3
" QR H$="£"
THEN GÜ
TÜ
360
768
IF H$<
V II
✓
D" HMD H$<>"d
I" THEN
GO
TO
740
810
STOP
LISTADO e
820>PRINT HT 21, 0.i "FILR Y COLUMNA-CO,. 6 > JUEGO NUEVO”
830 INPUT "FILñ " í FM; ’’ COLUMNA " ■ CN
835 F'RINT AT 21,0,"
848
IF FM=0 RMD CM“0 TH
EN
GO TO
950
850
IF ITK1 0|
? FM>3 OE
CM< 1
QR CF'
1: 3 THEN GÜ TÜ 89Ü
860
IF IvFM,Cr
1 >=0 THEN
GO
TO 986
\
87tf
F'RINT #1;
PAPER 1;
INK
. II
l .■
CASILLA OCUPADA
" i = PAUSE
200
880
890
GO TÜ 900
PRINT #1;
PAPER 1;
ÍNK
■"* . ii
i y
NO EMISTE ESA CELDA
" .i PAUSE
200
910
LET R=1
920
GO SUS 2021
')
94y
GÜ TÜ 820
950
PRINT #1;
PRPER I;
INK
? .¡ "
JUEGO CANCELADO
"; i PAUSE
200
960
LET NM=6 ;
ijQ Tu 590
970
RETURN
980
PRINT RT U
;i, 18; FU; RT
10,
25,1 en
LET I<FM,CM>«NR
990
RETURN
der el juego, intentarás impedir que
tu contrario te ponga una trampa
(gráfico 1). Protegerte de las tram¬
pas no es siempre fácil. En algunos
casos deberás evaluar las posibles
jugadas de dos turnos sucesivos pa¬
ra desbaratar una posible encerro¬
na. Incluso, la primera marca del ju¬
gador O puede conducirle a un posi¬
ble fracaso. Las siete configuracio¬
nes que el jugador O debe evitar en
su primer turno están en el gráfico 2.
Antes de seguir leyendo, puedes
comprobar por ti mismo que X pue¬
de ganar en cada una de esas situa¬
ciones.
Cómo juega el ordenador
En el siguiente párrafo, explicare¬
mos como el ordenador maneja am¬
bos papeles, jugador X y jugador C.
Ocasionalmente, puede sonar como
si el programa juega consigo mismo,
pero debes tener en cuenta que en
un real, tu representas un papel y la
máquina otro.
Las primeras marcas de ambos ju¬
gadores son tratadas como casos es¬
peciales. El programa usa movi¬
mientos preparados para estas juga¬
das, sin analizar las posiblesjugadas
siguientes, ni utilizar métodos
heurísticos. Para seleccionar las
marcas de los turnos siguientes el
programa utiliza cinco pruebas:
1. Buscar potenciales jugadas
para ganar, marcas que completen
una raya. Sí encuentra varias, el pro¬
grama escoge aleatoriamente entre
ellas.
2. Si el programa no puede en¬
contrar una marca que le dé la victo¬
ria, comprueba si el oponente puede
ser bloqueado para prevenir una
victoria en su siguiente turno (se in¬
vestiga una jugada adelante). El pro¬
grama bloquea la primera de esas
rayas que encuentra.
3. Si el programa aún no ha
marcado ninguna casilla, comienza
a buscar celdas para poner una
trampa al contrario, escogiendo la
primera que encuentre.
4. Si ninguna de estas compro¬
baciones ha resultado para marcar
una casilla, el programa busca casi¬
llas donde prevenir una posible
trampa del contrario en su siguiente
turno. Esto implica estudiar las posi¬
bles marcas de las dos jugadas si¬
guientes,
5. Para escoger entre las celdas
que pasan la prueba 4, el programa
selecciona la casilla que está en las
menos rayas posibles, estas rayas no
deben incluir ninguna de sus pro¬
pias marcas. La razón de esto, es que
cuantas menos rayas haya sin mar¬
cas del jugador, menos posibilida¬
des tiene el oponente de ganar el
juego. Sin embargo, este principio
no siempre produce la estrategia
más agresiva, por esto el programa,
ocasionalmente se colocará para
forzar un empate cuando es posible
obtener una victoria.
El programa
Presentamos el programa en blo¬
ques lógicos. Tecléalos según va¬
mos avanzando en la explicación. El
primer bloque inicializa el ordena¬
dor, crea varias matrices y asigna
ciertos valores para algunas varia¬
bles generales del programa:
ORDENADOR
- POPULAR
LA REVISTA QUE INTERESA TANTO AL AFICIONADO COMO AL PROFESIONAL
Cómprela en su kiosco habitual o solicítela a:
Ya está a la venta
Una publicación que
informa con amenidad
acerca de las novedades
en el campo de las
computadoras personales.
ORDENADOR POPULAR .;
la revista para el
aficionado a la
informática.
ORDENADOR
- POPULAR
BmwMurillo,377
Te!.7339662
mm-MADRii) .
LISTADO 1
LISTADO 7
1000 >
IF NM>1THEN
GO
TO
1210
1010
IF NROl THEN
GÜ
TO 1060
1020
GO SUB 2620
1030
LET FH-FT
1040
LET CPNCT
1050
GÜ T0 133Ó
1060
LET T=TÍ FÍ'L
en >
1070
G0 SUB 2620
1080
IF T=1 THEN
GO
TO
1 030
1081
IF T-2 THEN
GO
T0
me
1032
IF T“3 THEN
G0
TÜ
1140
1030
IF KFT,CT>
-3 THEN
GO TÜ
107
1100
G0 TO 1180
1110
LET FT~2
1120
LET CT~2
1130 ,
GÜ TO 1180
1140
IF I ( FT t CT >=
1 THEN
GÜ TÜ
11
80
1141
IF I(FT..CT>=
2 THEN
GO TO
11
50
1142
IF KFT, CT >~
3 THEN
GO TO
11
7ñ
1145
LET W-FT-FM ;
LET
y=
CT-CM
1150
IF RBS W-2 OR RB
S V
=1 THEN
GÜ
1160
GO I0 1180
1165
LET W-FT-Fr-U
LET
Y=
CT-CM
1170
IF RBS W=1
OR RBS
Y*1 THEN
lj|
1180
LET FM-FT
113G
LET CM=CT
1200
GO TO 1330
1070
1070
LISTADO &
1210 > IF NM>2TMEN GO TO 1240
1220 IF NR-2 THEN GO TO 1340
1230 GO TO 1500
1240 LET ST-NR
1250 LET 3L“2
1260 GO SUB 2240
1270 IF N«0 THEN GO TO 1340
1280 LET M=1NT í H4:RHD >+l
1230 LET R=G<M >
1300 GO SUB 2480
1310 LET FM-FÜ
1320 LEÍ CM=Cü
1330 GÜ TO 1330
L_ I:
BTñD O S*
1340;
LET
ST-3-NR
1350
LET
SL-2
1360
GÜ S
UB 2240
1370
IF
N—0 THEN GO T0 1430
1380
LET
R-GCN )
1330
GO
SUB 2480
1400
LET
FM=FÜ
1410
LET
en “Cu
1420
GO
TO 1330
La matriz I (fila, columna) contie¬
ne una imagen del tablero de juego.
Las líneas 40 a 90 leen los tres tipos
de casillas y los guardan en T(,), 1=
centro, 2=esquina, 3=lado. Las
líneas 100 a 150 leen en D{,) los vec¬
tores de dirección usados para gene¬
rar las ocho posibles rayas que hay
en el juego (gráfico 3). Para la raya
R, D(R, l) es el incremento en filas y
D(R,2) el incremento en columnas.
Las líneas 160 a 210 leen en A(,)
los atributos de las ocho rayas. Para
la raya R, A(R, 1) es la fila de salida y
A(R,2) es la columna, A(R,3) es la
dirección que sigue.
C$() almacena los caracteres usa¬
dos cuando se representa la rejilla:
«—» para celda libre, «X» y «O». J$()
guarda el nombre de cada jugador,
J$(2) es siempre «SPECTRUM».
«VC» contiene eí número de victo¬
rias de cadajugador y JE el de juegos
empatados, las tres son inicializadas
a cero.
En la línea 254 está la rutina de in¬
troducción del nombre de) jugador
humano, si este nombre contiene
más de 8 caracteres es truncado para
que pueda almacenarse en J$(). En
las líneas 330 y 340 se determinan
cuáles son los jagadores para el pri¬
mer enfrentamiento. J(N)=1 indica
que el jugador N es humano y J(N)=
2 que es el ordenador.
El siguiente bloque de líneas se
encarga de iniciar un nuevo juego:
LISTADO 2
Las líneas 360 a 380 hacen que los
jugadores intercambien sus órdenes
de salida cuando se inicia un nuevo
juego (la línea 350 mantiene el or¬
den para el primer juego). NM es el
número de movimiento, inicial¬
mente a 0. Un movimiento comple¬
to consiste en 2 marcas, una X y un
0. Las líneas 420 a 460 vacían la reji¬
lla para un nuevo juego. Ahora el
programa está preparado para la pri¬
mera marca:
LISTADO 3
Primero el contador de movi¬
mientos es incrementado y el nú¬
mero de jugadas es 1 (líneas 470 a
480). La subrutina llamada en 500
LISTHDP 16
Í430> 1F NF1*£TH£H GO Tü 1566
1446 LET ST=NR
1450 GO SUB £666
1460 1F N<>2 THEN G0 TO 1500
1476 LET FM-FV
1488 * LET CM*CV
1496 GO TO 1996
LISTRDO 11
1560> LET FS=0
1510 FOR F-l TO 3
1526 FOR OI TO 3
1530 1F I(F,CX>0 THEN GO TO 1760
1540 LET KF,C>=NR
1550 LET 3T”NR
1560 LET SL=2
1570 GO SUB £240
1580 IF N»0 THEN GO TÜ 1680
1590 IF NH-2 AND HP=1 THEN GO TO 1720
1600 LET R-GÍ 1
1610 GO SUB £486
1620 LET ST-3-NR
1630 LET IíFÜ,CCD~ST
1640 LET SL-2
1650 GO SUB 2£40
1660 LET KFO,CO>*0
1670 GO TU 1718
1680 IF NM“£ RND NR*1 THEN GO TO 1750
1690 LET ST-3-NR
1700 GO SUB £660
1710 IF N=2 THEN GO TO 1,750
1720 LET FS-FS+l
1730 LET Oí FSj> 1 )—F
1740 LET ÜÍFS,£XC
1750 LET I(F,C>=0
1760 NEXT C
1770 NEXT F
L. X 5 T R D O X S2
1780 > LET SL“£
1790 LET ST“3-HR
1800 FOR C~1 Tü F
1810 LEÍ IÍ Oí C, 1 >, Oí C, 2 >>=NR
1820 GO SUB 2240
1830 LET I í Oí C .'IX Oí C f 2 > )~Q
1840 LET Oí C.. 3 >”M
1850 NEXT C
1860 IF F$<>1 THEN GO TO 1890
1870 LET CN"1
1890 LET SM=1
1900 FOR U-2 TO FS
1910 IF OíSN,3X0ÍW,3> THEN GO TO 1930
1920 LET SM=W
1930 NEXT U
1948 LET CN-INT ÍFS*RND>+1
1950 IF Oí CH.' 3 >=0< SMí 3 > THEN GO TO 1970
1960 GO TO 1940
1970 LET FN=OÍCN, 1 ;■
1980 LET CM-OÍCN,2 )
imprime la rejilla de juego en el es¬
tado actual y la 520 indica de quién
es el turno de jugar. Dependiendo
del jugador que debe marcar, las
líneas 530 y 535 llaman a una u otra
subrutina. La de la línea 820 es para
recibir desde teclado la elección de
casilla del jugador humano, y la de
la línea 1000 para que el programa
siguiendo su lógica, seleccione una
celda. Después de realizar la selec¬
ción el programa evalúa su efecto:
LISTADO 4
La subrutina llamada en 560 bus¬
ca en las ocho rayas para ver si el ju¬
gador actual ha ganado. N>0 indica
que ha ganado, en ese caso las líneas
640 a 680 anuncian el nombre del ju¬
gador e incrementan su contador de
victorias. Si N=0, el ordenador com¬
prueba el número de movimientos
NM para ver si el juego ha termina¬
do de alguna otra manera. Hay sólo
9 casidas en la rejilla, y cada movi¬
miento representa ocupar dos de és¬
tas, una para cada jugador. Ordina¬
riamente, NM no puede exceder
nunca de 5, porque la X del movi¬
miento número 5 siempre ocupa la
novena casilla (2+2+2+2+1=9 casi¬
llas). Sin embargo, si un jugador
cancela el juego, NM de carga con 6.
La línea 590 detecta esa condición y
salta al menú de continuación.
Cuando NM=5, el ordenador de¬
duce un empate (no hay ganador y
todas las celdas están marcadas), y
10 anuncia (líneas 690 a 720). En
otro caso NM es menor que 5, así el
programa da el turno al siguiente ju¬
gador.
Las líneas siguientes imprimen el
menú de continuación al final del
juego:
LSITADO 5
Se imprimen los contadores de
victorias y de empates y se pregunta,
si se quiere terminar o seguir jugan¬
do. Este es el final del programa
principal. Ahora presentaremos las
dos rutinas más grandes, el turno
del humano y el turno del ordena¬
dor.
Submtinas
El programa llama a la siguiente
L_ I STRDO 13
1990> LET I< FM, CM >=NR
2006 PRINT FHT 10,18jFMíAT 10i25iCt1
2010 RETURN
L. I STRDO 1
2020> LET QF*fi<R/l)
2030 LET GC-FK R:2 '?
£040 LET DN=FKR,3>
2050 LET QL-0
2070 F0R U=l TO 3
2080 PRINT FlT 5+< U-l )#£, 1 .; " "
£090 FOR V-l TO 3
2100 IF QL--3 OR WOQF OR VOQC THEN
GO TO 2180
2120 PRINT C«I(W,Y>+l)i
2140 LET QF-GSF+DÍDN,1 )
2150 LET QC=QC+[XDN,2>
2160 LET QL=QL+1
£170 LO TO 2190
2130 PRINT C3K KU/O+1 X;
2190 PRINT "
£200 NEXT Y
2220 NEXT U
£230 RETURN
LISTADO 15
2240> LET N”0
£250 LET n~0
2260 FOR R~1 TO 8
2270 LET FU-fi<R,l>
2280 LET CU-R(R,2)
2290 LET DN«FKR,3 >
2300 LET NF=0
2310 LET MF*S
2320 FOR 2=1 TO 3
2330 1F I< FIO CU >“0 THEN GO TO 2380
2340 IF I<FU,CU>«ST THEN GO TO £370
2350 LET MF=MF+1
2360 GO TO 2380
2379 LET NF-NF+1
£380 LET FU=FÜ+D« DN, 1>
2390 LET CU-CU+LX DN, £ >
2400 NEXT 2
2410 IF NFOSL OR MF>@ THEN GO TO 2440
2420 LET N=N+1
2430 LET G<N >*R
2440 IF MF>0 THEN GO TO £460
2450 LET 11=11+1
2460 NEXT R
2470 RETURN
subrutina cuando es el turno del ju¬
gador humano:
LISTADO 6
Las líneas 820 a 830 inquieren al
jugador para que especifique la fila y
columna de la celda a marcar. Las fi¬
las están numeradas de arriba a aba¬
jo y las columnas de izquierda a de¬
recha. Si el jugador selecciona 0,0,
el juego es cancelado. Cualquier
otro par fila-columna inválido detie¬
ne el programa y pregunta de nuevo
al jugador su elección (870-940).
Dado un par tila-columna válido,
la línea 860 determina si la celda es¬
tá vacía, I(FM,CM)=0. Si la celda
está vacía la línea 980 imprime la op¬
ción y la marca en la matriz imagen.
La línea 990 retorna al programa
principal.
Cuando es el turno del ordena¬
dor, el programa llama a la rutina en
la línea 1000. El programa usa movi¬
mientos preparados para la primera
Xy el primerO. La primera X es una
elección aleatoria, y el primero 0 es¬
tá determinado por la posición de la
X anterior. Para los movimientos si¬
guientes, el ordenador usa la lógica
de evaluar los posibles movimientos
sucesivos.
Las siguientes líneas manejan las
primeras X y O del ordenador:
LISTADO 7
Sí el número de movimiento NM
es mayor que 1, la línea 1000 hace
que el programa salte a las rutinas
de investigación de posiblesjugadas
sucesivas que serán descritas más
adelante. Si NM—l y NR=], el pro¬
grama hace la primera marca, una
X. La subrutina llamada en la línea
1020 selecciona una celda aleatoria¬
mente, y las líneas 1030 y 1040 guar¬
dan la situación de dicha casilla en
las variables FM y CM, La línea
1050 provoca un salto al final de la
subrutina que maneja el turno del
ordenador.
Las líneas 1060 a 1200 actúan
cuando el ordenador es el jugador O
y el número de movimiento es 1; de¬
ben encontrar una celda que evite
las siete posiciones de pérdida del
juego. En la línea 1060, las variables
FM y CM contienen la fila y colum¬
na del movimiento más reciente; en
otras palabras, informan al progra¬
ma cuál celda contiene la X. La línea
1060 determina en qué tipo de casi¬
lla está la X: centro, esquina o late¬
ral.
La subrutina llamada en la línea
1070 selecciona ai azar una celda va¬
cía T(FT,CT) como candidata para
el siguiente movimiento del jugador
O. Las 1080, 1081, 1082 saltan a la
comprobación de seguridad apro¬
piada, dependiendo del tipo de cel¬
da que está marcada con X.
Una vez que el programa ha loca¬
lizado una celda segura, las lineas
1180 y 1190 guardan su dirección de
fila y columna, y la línea 1200 salta al
final de la subrutina del turno del or¬
denador.
En el caso del segundo movi¬
miento y los siguientes, el programa
no usará movimientos preparados.
Primero comprobará sí puede ganar
con una marca:
LISTADO 8
Para los números de movimiento,
NM, iguales o mayores que 3, las
líneas 1240a 1330buscan una casilla
que de la victoria. La subrutina lla¬
mada en la línea 1260 cuenta el nú¬
mero de rayas no bloqueadas que
contengan al menos 2 marcas dle ju¬
gador NR. Si N=0, no hay tales
rayas, así el programa salta a la ruti¬
na del movimiento defensivo.
Si N>0, entonces la matriz G()
lista las rayas que contienen celdas
ganadoras. La línea 1280 selecciona
aleatoriamente una de estas rayas, y
la subrutina llamada en la línea 1300
encuentra la fila y columna de la cel¬
da libre en esa raya. En la linea 1280
se genera un número aleatorio entre
1 y N.
Cuando el programa localiza una
celda para ganar, las líneas 1310 y
1320 almacenan su número de fila y
de columna y la línea 1330 salta al fi¬
nal de la subrutina. Si el programa
no puede encontrar una celda gana¬
dora, comprueba si puede impedir
que su oponente gane en su siguien¬
te turno:
LISTADO 9
La línea 1340 sitúa en ST el nú¬
mero del jugador contrario. La su¬
brutina llamada en 1360 cuenta el
número de rayas no bloqueadas que
contienen al menos 2 marcas del ju¬
gador contrario. Si N=0, no hay
rayas de ese tipo, y el programa salta
a la rutina de colocación de trampas.
Si N no es 0, entonces hay al menos
una posibilidad de que el contrario
gane en su siguiente marca. Las
líneas 1380 y 1390 encuentran la cel¬
da ganadora del oponente y las
líneas 1400 y 1410 almacenan la di¬
rección de su fila y su columna, y así
el ordenador puede ocuparla. La
línea 1420 salta al final de la rutina
del turno de la máquina.
LISTADO 10
La subrutina de la línea 2660 com¬
prueba cada casilla vacía para ver
cuál, si hay alguna, produce una
trampa. Si N=2, el programa ha en¬
contrado una celda, y las líneas 1470
y 1480 guardarán su número de fila y
columna para que el ordenador la
utilice. La línea 1490 salla al final de
la subrutina del turno del ordena¬
dor.
Si no se encuentran oportunida¬
des de colocar una trampa, el pro¬
grama comprobará cada celda vacia
para ver cuál impediría al contrario
colocar una trampa en su siguiente
marca. Esta es la evaluación de posi¬
bles jugadas futuras de más alcance
que realiza el programa:
LISTADO 11
La variable FS cuenta el número
de celdas seguras (aquellas que im¬
piden al oponente poner una tram¬
pa). En las líneas 1730 y 1740, para
cada celda segura FS que es encon¬
trada, 0(FS,1) y 0(FS,2) guardan su
número de fila y columna. Una vez
que el programa ha localizado todas
las celdas seguras, aplica el método
heurístico para escoger entre ellas:
LISTADO 12
El programa marca cada celda se¬
gura (línea 1810) y entonces cuenta
cuántas rayas M no bloqueadas que¬
dan. Para cada celda segura FS,
P(FS,3) guarda el número de rayas
no bloqueadas que quedan cuando
la celda es marcada.
Las líneas 1900 a 1930 comparan
los resultados de estas marcas de
prueba para ver cuáles de éstas están
en el menor número posible (SM)
de rayas no bloqueadas. En las
líneas 1940 a 1960 el programa esco¬
ge aleatoriamente celdas seguras
hasta que encuentra una que deje
SM rayas no bloqueadas. En la linea
1940 se genera un número entre 1 y
FS.
Las siguientes líneas finalizan la
subrutina que controla el turno del
ordenador:
LISTADO 13
La línea 1990 marca el número de
jugador NR en la posición de rejilla
I(FM,CM). La línea 2000 anuncia el
movimiento, y la línea 2010 devuel¬
ve el control al programa principal.
Rutina de impresión y
auxiliares
Aquí está la rutina que imprime el
tablero de juego:
LISTADO 14
La línea 2080 controla la línea de
impresión, la columna se controla
imprimiendo espacios (línea 2190).
Las rutinas auxiliares son reque¬
ridas en ciertas secciones del pro¬
grama para realizar funciones meno¬
res. Esta primera subrutina analiza
el contenido de las seis rayas posi¬
bles:
LISTADO 15
Al volver de esta subrutina, la ma¬
triz G() lista los números de las N
rayas no bloqueadas que contengan
al menos SL marcas del jugador ST.
La variable N cuenta el número de
rayas no bloqueadas que contienen
al menos SL marcas deljugador ST.
La variable M cuenta el número de
rayas que no contienen ninguna
marca del otro jugador.
La rutina que viene a continua¬
ción localiza la primera marca en la
raya R:
LISTADO 16
De vuelta, FO es la fila de la raya
abierta y CO la columna. La siguien¬
te se encarga de seleccionar una ca¬
silla vacía:
LISTADO 17
I
1— I S 1 f
i C* O
1 &
2660'.:
■ FQR
W~ i TO
2676
FOP
Y= 1 TO
3
2680
IF I
( 14.. Y X
0 THEN GO TO
2698
LEI
8L=2
2780
LET
K 14, Y
)=8T
2718
60
SUB 22'
40
2720
LET
KM, Y
>:-0
2730
IF !
N<2 THEN GO TO 2730
2740
LET
FV=N
2750
LET
CV=Y
2766
LET
14=3
2770
LET
Y--3
2780
NEN
T Y"
2798
NEXT
M
2800
RETURN
L„ I STMDO i 7
2620> LET FT-INT < 3TRND >+1
2630 LET CT-INT <3*RND)+1
2640 IF I(FT■CT >< >0 THEN LO 7 0 2620
2650 RETURN
LIST ROO 1«S
2480> LET FO-0
2490 LET CO~0
2500 LET FT~ñ< R .• 1 >
2510 LET CT=ñ< R, 2 >
2520 LET DN“ñ(R > 3>
2538 FQR 14=1 TO 3
2548 IF KFT/CTK>0 THEN GG TO 2588
2558 LET FO-FT
2568 LET CO-CT
2570 LET 14=3
2580 LET FT=FT+D< OH >1>
2598 LET CT=CT+D< ON, 2 >
2600 NEXT W
2618 RETURN
En las líneas 2620 y 2630 se obtie¬
nen el número de fila y columna
aleatoriamente. En el retorno, la fila
se guarda en FT y la columna en CT.
Por último, presentamos la subruti¬
na que busca la oportunidad de co¬
locar una trampa:
LISTADO 18
Al principio de la subrutina, ST es
el número de jugador que intenta
colocar la trampa. Al final, N=2 in¬
dica que se ha encontrado u na tram¬
pa y, FV y CV almacenan el número
de fila y columna de la celda donde
se va a colocar.
Retoques
Puedes conseguir que la máquina
juege consigo misma si en la peti¬
ción de nombre introduces “SPEC-
TRON”. En ese caso, un testigo
(TES) se ponee a 1 en la línea 530
que provoca el salto a la rutina de
petición de celda para el jugador hu¬
mano, se fuerza con una condición
lógica el salto a la rutina de tumo del
ordenador, sólo que ahora el núme¬
ro de jugador es 1 y la lógica del pro¬
grama opera con las otras fichas si¬
guiendo la misma estrategia descri¬
ta al principio del artículo.
Después de jugar contra la má¬
quina puedes encontrar frustrante
que el ordenador nunca pierda. Si
juegas tan bien como él, cada juego
acabará en empate. Para hacerlo
más excitante, puedes simplificar la
estrategia del ordenador de varias
maneras. Primero, puedes eliminar
los movimientos preparados para el
primer O, saltando esa sección del
logical. Por ejemplo:
1010 REM ANTES HABIA: IF
NRol THEN GOTO 1060
Después de hacer este cambio,
observarás que a menudo, el orde-
X CENTER, X SIDE,
O ANY SIDE: O FAR CORNER:
Las siete posiciones de fracaso para el jugador O en su primera marca.
Path 1: Path 2: X SIDE, X CORNER,
El jugador O puede evitar la trampa marcando cualquiera de las dos casillas
seguras indicadas con asterisco.
nador mueve a las posiciones de
perdición del gráfico 2. Puedes tam¬
bién eliminar la posibilidad de que
el ordenador ponga o detecte tram¬
pas mediante:
1500 GOTO 1020: REM ANTES
HABIA: LET FS=0
Después de hacer este cambio, el
ordenador jugará al nivel más bajo
de estrategia, comentado en el pá¬
rrafo “COMO JUEGA EL ORDE¬
NADOR”. Incluso en este nivel la
máquina puede sorprenderte reali¬
zando un brillante movimiento
aleatorio.
PROGRAMAS
PROGRAMAS
CRAPS
Basado en el juego de dados «Craps», el programa que nos ha enviado desde
Valencia José‘Gallego muestra en todo momento información sobre
la cantidad apostada, el dinero de que se dispone y el récord de ganancias.
Incluye unas-completas instrucciones, aunque su manejo no es nada
complicado, ya que sólo hay que responder a las preguntas que efectúa el
ordenador. Las lineas 5 y 6 permiten utilizar un juego de caracteres diferente
al del Spectrum, situado a partir de la dirección 64250. Por consiguiente, si
no se va a emplear un juego de caracteres alternativo, es necesario
eliminarlas.
i REM
CRAPS
JUEGO DE DADOS
44
PRINT
AT
II
11,4;
46
PAUSE
5
48
PRINT
AT
12,4;
2 REM
3 REM JOSE GALLEGO GONZALEZ
VALENCIA-ABRIL 1986
4 REM
5 LOAD 11 chars*'CODE 64250,768
6 POKE 23606,250: PQKE 23607,
249
8 CLS : PRINT FLASH 1; AT 11,
10; "PARA L.A CINTA"
10 GQ SUB 9000
15 POKE 2365B,8: LET di-lOOí L
ET rc=Ü; LET "*-*■*•**■#•"
20 REM PRESENTACION
21 BQRDER 4: PAPER 4: INK O: C
L3
24 FÜR >:=7 TQ O STEP -1
30 INK X
32 PRINT AT 8,4;"
ll
34 PAUSE 5
36 PRINT AT 9,4;"
II
38 PAUSE 5
40 PRINT AT 10,4;"
II
42 PAUSE 5
50 PAUSE 5
52 NEXT x
55 PRINT PAPER 7;
INK 0;AT
T
5;“AB";AT 4,5;"CD"
58 FÜR >: = 1 TO 10Os
NEXT x
60 PRINT PAPER 7;
INK 0;AT
1 ,
15; "EE" ; AT 2,15; II EE"
62 FÜR x = l TO 100:
NEXT x
65 PRINT PAPER 7;
INK 0:AT
3,
25;"FB";AT 4,25;"CG"
67 FÜR x-1 TÜ 100s
NEXT x
70 PRINT PAPER 7;
INK 0;AT
16
,28;"FH";AT 17,28;"!
G"
72 FOR >; = 1 TO 100:
NEXT x
75 PRINT PAPER 7;
INK 0;AT
16
,15;"E ";AT 17,15;"
E 11
77 FQR x = 1 TO 100:
NEXT x
80 PRINT PAPER 7;
INK 0;AT
16
,2; " J J 11 ; AT 17,2; "KK"
88 FOR x = 1 TQ 100:
NEXT x
90 FOR 1=0 TO 250
92 POKE 23606,1
94 PRINT #1:AT 1,7; JOSE GAL
LEGO 1986"
96 NEXT I
98 FOR x = l TO 500; NEXT >:
PROGRAMAS
100 REM INSTRUCCIONES
105 CLS
110 FRINT AT 1,7;“* INSTRUCCION
ES *"
115 PRINT AT 3,0;" El juega con
siste en lanzar losdados y jugar
contra la banca-"
120 PRINT AT 6,0;" Si sale 7 o
11 a la primera ti—rada, se gana
la misma cantidadde lo apostad
a. "
125 PRINT AT' 10,0;" Si sale un
2, 3 o 12 a la pri- mera, se pi
srde- "
130 PRINT AT 13,0; " Cua 1 qui er
otra puntuación, secanvierte en
TU PUNTO. Si s:l guestirando y re
pites tu punto, ga-nas el dable
de lo apostado,perasi sale 7, p
ierdes."
135 P ñ XNT #0;AT 1,0;"PULSA PARA
EMPEZAR"
140 PAUSE 0
145 RANDDMIZE
150 LET di=1005 CLS
155 ÍNPUT #1 ; AT 1,0;"'Tu nombre
? (man.6 1etras> " ; LIME a$
160 IF LEIM a$<1 GR LEN a*>6 THE
N G0 T0 155
200 REM JUEGO
202 LET ap=0s LET ti=0s LET tp“
0
205 CLS
210 PRINT IÑK 0;"DIÑERO 11 ;TAB í
9);"APUESTA";ThB (21); FLASH 0;"
RECORD"
215 PR 1 NT INK O; TAB (1) ; di ; TAB
(ll);ap;TAB (19);ni;TAB (27);re
225 INPIJT # 1; AT 1,0; " * Cuanto ap
cestas? (min. 10) " ;ap
227 IF ap<10 GR INI apOap THEN
GÜ TO 225
230 IF ap<=di THEN GG TG 240
235 PRINT #1;AT 1,0;" ©NO TI
ENES TANTO DI ÑERO *": BEEP 1,-10:
POR a -1 TO 200: NEXT : GÜ TO 2
25
240 LET di=d:i. -ap: INPUT 0
245 PRINT INK 0;AT 1,1;"
11 ; AT 1 , 1 ( di ; AT 1,10; " " ; AT
1 , .!. 1 , p
247 PRINT #1;AT 1,8;"PULSA PARA
TIRAR 11 s IF I NK£Y*= " " THEN GG T
0 247
248 PAUSE Os INPUT Os PAUSE 10
250 PRINT AT 7,12;" ";AT 8,12;
" ";AT 5,16s" ";AT 6,16;" "
252 POR n=5 + (RND*15) TO 0 STEP
-1
253 BEEP .005,10
254 PAUSE 6: NEXT n
256 PRINT AT 7,12;" ";AT 8,12;
" " ; AT 5,16;" ";AT 6,16; " "
258 LET c1=0: LET c2=0; LET xl=
19: LET x 2=17: LET 11=0: LET t2=
0: LET ti=ti+l: LET re=0
260 IF c1=7 AMD c2=7 THEN GG T
O 280
270 PRINT AT x 1 , 12 ;" ";AT xl + i
,12;" ";AT x2,16;" ";AT x2+1,1
6 ; " "
280 LET a 1=0: LET á2=¡0
290 IF C1 >'= 1 THEN LET xl=xl-2
300 IF c2>=l THEN LET :<2=x2-2
305 IF c1>=7 AND c2>=7 THEN GÜ
TÜ 600
310
LET
a=I NT (RND+6+1)
320
LET
b=INT (RND+6+1)
330
LET
ci=cl+is LET c
2=c2+l
340
LET
al=a*100+900
350
IF
el07 THEN 60
SUB al
360
LET
tl=t1+2
370
LET
a2=b*100+1900
580
IF
c2<==7 THEN GO
SUB a2
590
LET
t2=t2+2
595
GG
TO 260
600
REM
RESULTADO TIRADA
602
LET
re=a+b
605
IF
re=2 THEN LET
r O" DOS "
606
IF
re=3 THEN LET
r$="TRES"
607
1 1
IF
re=4 THEN LET
rT="(IUATR
608
IF
re-5 THEN LET
r:f=" CINCO
609
IF
re=6 THEN LET
rO"SEIS"
610
IF
re=8 THEN LET
ri--:" OCHO"
611
IF
re =9 THEN LET
ri=" IMUEOE
612
IF
re=10 THEN LET
' rO"DIEZ
&
PROGRAMAS
613 IF
il
re= 1.1
THEN LET rí="
ONCE
614 IF
li
r e= 12
THEN LET rí®"
DOCE
615 IF
re=tp
AND ti>1 THEN
GO
TO 800
620 IF
(re—7
OR re=ll) AND
t i < -
1 THEN
GÜ TO
700
630 ÍF
(re—2
OR re—3 GR re=
12)
AND ti<=i THEN 60 Tü 730
640 IF <re=4 0R re==5 OR ra=¿ OR
re=8 QR re=9 OR re=lO) AND ti<=
1 THEN 60 TÜ 760
650 IF re=7 AND ti>1 THEN GO T
Ü 730
660 IF re<>tp AMD ti>1 THEN GO
TO 830
700 REM PREMIO
701 IF re-7 THEN LET r$="@SIET
E! "
702 IF re* 11 THEN LET r$="@QNC
E ! "
705 BEEP 0.5,20
710 PRI NT I Nl< O; AT i 4,13; r $; AT
16,10; " HAS GANADO " ; ap : LET d i *=
di -i-ap -*2
715 IF di>100 AND di>rc THEN L
ET rc=di s LET r.$=aí: PRINT AT 1,
19;¡ " " s PRINT INK 0:¡AT 1,1
9;ni;AT 1,27;re: PRINT INK O; F
LASH 1;AT O,21;"RECORD 1 '
720 FOR X = 1 TÜ 300 : NEXT GO
SUB 3000
725 GO TÜ 200
730 IF re=2 THEN LET rf="DÜS"
731 IF re—3 THEN LET rí-="TRES "
732 IF re® 12 THEN LET r:f-"DÜCE
II
733 IF re=7 THEN LET r$="SIETE
íl
735 BEEP O «5,-10
740 PR INT I NK O 5 AT 14,13; r $; AT
DISPONEMOS DE TAPAS ESPECIALES PARA
SUS EJEMPLARES DE
(cada tapa as para 6 ejemplares)
Mospectnm
SIN NECESIDAD DE ENCUADERNACION
UNIDAD
PRECIO
fcS O P*g;
Para hacer su pedido, rellene este cupón HOY MISMO
y envíelo a:
Bravo Muidlo, 377
lOHwSpVdrUII Tel. 733 96 62 - 28020 MADRID
—
Por favor envíenme .. tapas para Ja encuadernación de mis
ejemplares de TÜDÜSPECTRUM. al preíMO dé 650 pt$. más gastos de envío.
El importe lo abonaré
□ POR CHEQUE □ CONTRA REEMBOLSO □ CON MI TARJETA DE
CREDITO □ AMERICAN EXPRESS" O VISA □ INTERBANK
Número de mi tárjela; f[ 1 I i I [‘ i II 1 1 1 i L I I I I] ti El I U
Fecha de caducidad .„. Firma
NOMBRE .
DIRECCION
CIUDAD
PROVINCIA
C P
J
PROGRAMAS
16,9:; "HAS PERDIDO " ; ap
746 IF di<10 THEM 60 TO 3300
750 FQR x*l TO 300: NEXT x: GQ
SUB 3000
755 SÜ TO 200
770 PR INT INK O; AT 14,13;rí;AT
16,12;"TU PUNTO"
772 FOR x ™ 1 TO 200: NEXT x
775 PRINT INK O;AT 9,O;"TU PUN
TO" ; AT 11,3; re: LET t.p=re
780 FOR x=l TO 100: NEXT x
782 PRINT AT 14,13;" " ? AT
16,12;"
790 80 TO 247
800 BEEP 0.5,20
1 @TU
{3.
810 P R INT INK O 5 AT 14,1: .
PUNTO!"s AT 16,10; "HAS BAÑADO
p*2: LET di=di+ap*3
815 IF di>100 AND di>rc THEM L
ET rc-d i: LET ní»i$: PRINT AT i,
19;" "5 PRINT INK 0;AT 1,1
9; rrT? AT 1 ,27; r c : PR I NT I NK O; F
LASH 1;AT 0,21?"RECORD"
820 FQR x=l TO 300: NEXT x: 80
SUB 3000’
825 Gü TQ 200
840 PRINT INK OAT 14,3.3; r$
844 FQR x=l TO 200: NEXT x
846 PRINT AT 14,13?"
850 80 TO 247
1000 REM CARAS DADO 1
1001 PRINT PAPER 7? INK 0;AT xl
,12;"AB";AT x1+1,12?"CD"
101O
1020
1040
1100
, 12;
1 110
1120
1140
1200
, 12?
1210
1220
1240
1300
, 12 ;
1310
1320
1340
1400
, 12?
1410
1420
1440
1500
, 1.2;
1510
1520
1540
2000
2001
i 16;
2010
2020
BEEP 0.01,1
FÜR x — 1 TQ ti:
RETURN
PRINT PAPER 7;
"E 11 ? AT x 1 + 1,12;
BEEP 0.01,1
FOR x=l TO ti:
RETURN
PRINT PAPER 7;
"FB";AT x1+1,12?
BEEP 0.01,1
FOR x~l TO ti:
RETURN
PRINT PAPER 7;
"EE"? AT x1 + 1,12;
BEEP 0.01,1
FOR x- = 1 TQ tía
RETURN
PRINT PAPER 7 i
"FH"?AT x1+1,12?
BEEP 0.01,1
FQR x*=l TO ti:
RETURN
PRINT PAPER 7?
11 JJ" ; AT x 1 + 1, 12 ;
BEEP O .01 ,1
FÜR x“ 1 TO ti:
RETURN
REM CARAS DADO
PRINT PAPER 7?
"AB";AT x 2+1,16;
BEEP O.O1,1
FOR x = 1 TO t2:
NEXT x
INK 0?AT xl
«1 p ii
NEXT x
INK O;AT xl
"CG"
NEXT x
INK O;AT xl
1 * E Ei M
NEXT x
INK O;AT xl
"IB"
NEXT x
INK O;AT xl
n j,. 11
NEXT x
INK O;AT x 2
fl II
6 ¡
NEXT
PROGRAMAS
2040 RETURN
2100 PRINT PAPER 7; INK OqAT x2
, 16;‘‘E AT x-2+1 , 16; E"
2110 BEEP 0.01,1
2120 FOR j<“í TO t2: NEKT
2140 RETURN
2200 PRINT PAPER 7:: INK O; AT x2
,16; "F B " ; A l" x2+l, 16; "CCS"
2210 BEEP 0.01,1
2220 POR ;< = 1 TO t2: NEXT x
2240 RETURN
2300 PRINT PAPER 7; INK O;AT x2
,16; "EE ’* :¡ AT x2+l ,16: "EE“
2310 BEEP 0.01,1
2320 FOR x—1 TO t2ü NEXT x
2340 RETURN
2400 PRINT PAPER 7; INK O; AT x2
, 16;"FH" ; AT x2+l,16; M 16"
2410 BEEP 0.01,1
2420 FOR x = l TO t2: NEXT x
2440 RETURN
25500 PRINT PAPER 7; INK O ; AT x2
,16;"JJ";AT x2+l ,16;"KK "
2510 BEEP Q.01,1
2520 FOR x«l TO t2; NEXT x
2540 RETURN
3000 REM FIN DE JUEGO
3001 PGKE 23658,8
3003 PRI NT AT 9, O ;¡ " " ■ AT
11,3;" "; AT 14,12; "
" í: AT 16,9; "
3005 PRINT #1 ; AT 1 ,0;"‘SIGUES JU
GANDO?(S/N5 "
- 30 1 0 IF INK EY-T="" QR (IN K EY %<>"S
“ AND INKEYTC >"N") THEN GO TO 3
010
3020 IF INKEY4= ,, S" THEN RETURN
3030 IF INKEY$="N" THEN PRINT #
15 AT 1 , 0 ; "• J UEG A OTRO?( Q/ N >
3035 PAUSE O
3O 4 O IF INKE Y$=" " O R ( I NK E Y $ < > " S
" AND INK EYT<>"N" ) TH E N GO TO 3
040
3045 IF INKEY$»"N" THEN GO TO 3
ico
3050 IF INKEYT=-" S " THEN PRINT #
1;AT 1,0:" 'QU 1ERES I NSTRUCC IONES
? < S / N) "
3055 PAUSE O
3060 IF INKÉY$*" " OR (INKEYTC >"S
11 AND INKEYTC >"N" )
060
THEN
GÜ TO
3065 IF INKEY$~"S"
00
THEN
60 TO
:l
3070 IF 1NKEYT ==" N"
45
THEN
GÜ TQ
1
3100 PÜKE 23606,0:
PÜKE
23607,
60
s BOEDER 7¡ PAPER 0
30: PAPER 7; CLS :
: CLS : PAUSE
PRINT #0:
1902 Sinclair Research Ltd.": PA
USE O: BÜ TQ 9999
3500 FOR x=*i TO 300: NEXT x
3503 PRINT AT 9,0; " " ;AT
11,3;" AT 14,12;"
";AT 16,9;" »
3505 PRINT #:L;AT 1,5; "NO TIENES
DINERO PARA SEGUIR A
POSTANDO"
3510 FOR x= 1 TO 300: NEXT x
3515 INPUT O
3520 PRI NT # 1 AT 1 , O ; " ' JUEGA ÜTR
O?(S/N)"
3530
00 TO 3035
9000
REM GRAFICOS
9010
FOR n
i=U3R "a" TO USR "k"+7
9020
READ
dato
9030
PGKE
n,dato
9040
NEXT
n
9050
DATA
Q, 0,0, 0, 0,0,0
,1
9060
DATA
0,0,0,0,0,0,0
, 1 28
9070
DATA
1,0,0,0,0, 0 ,0
,0
9080
DATA
128,0,0,0,0,0
,0,0
9090
DATA
0,0,0,24,24,0
, o, 0
9100
DATA
0,0,0,24,24,0
,0,1
9110
DATA
128,0,0,24,24
,0,0,0
9120
DATA
0,0,0,24,24,0
, 0,120
9130
DATA
1 ,0,0,24,24,0
, 0,0
9140
DATA
0,0,0,24,24,0
,0,24
9150
DATA
24,0,0,24,24,
0,0,0
9160
RETURN
9990
SAVE
"CEAPS" LINE
5: SAVE
c hara 1 1 CODE 6 4250,760
9991 CLS P RI NT "Programa graba
do" 1 J " Reb ob i ríe la cinta y pu 1 se"
' 11 una tec la p ar a ver i i i car " : PAU
SE O
9992 PR INI . Pulse PLAY": VER1FY
"GRAPS": VERIFY "chars"BODE 642
50 , 760
9993 PRINT ""Correcto 11
«Libro del RS-232» de Anaya Multi’
media en el que encontrarás todos
los datos que te sean necesarios,
Al ser el RS-232 una norma stan¬
dard, con el software adecuado po¬
drás conectar el Spectrum a cual¬
quier otro ordenador que disponga
de salida RS-232,
EN BUSCA DEL LISTADO
PERDIDO
En el número 20 de su revista, en el
artículo «La guía del Hacker» falta el
programa 2, Les agradecería que re¬
solviesen el problema publicando el
listado de dicho programa.
Dirige tus cartas a:
Todospectrum
Bravo Murillo. 377, 5
28020 Madrid
Angel J. Valiente
Castellón
De nuevo los duendes han hecho
travesuras con nuestros listados. A
continuación publicamos el listado
ca, lo más probable es que se dete- P cr dido.
riore alguno de los dos aparatos.
3. El Wafadrive es un sistema de
almacenamiento rápido de datos en
cartuchos de cinta sin fin similar en
funcionamiento al microdrive de
Sinclair.
4. El 128K es totalmente compati¬
ble con el Spectrum normal por lo
que no debería haber ningún pro¬
blema en conectar las unidades de
microdrive a su ordenador. . S( * un as . ld “ 0 lect0 '¡ de ™* stra rc *
vista, especialmente del suplemento
QL. Soy propietario de un QL ver¬
sión MGE y quisiera que me respon¬
dieseis a unas preguntas:
1. ¿Existe algún libro en castellano
sobre código máquina del 68008?
2. ¿Cómo puedo conectar una im¬
presora Seikosha SP100 con salida
Centronics?
PROBLEMAS CON EL 128
10 CLEAR 40000: LO A D“”CO D E
POKE 65 440,81: POKE 65441,101:
RANDOMJZE USR 65458
Hace escasamente unos días que
he adquirido un SPECTUM 128 y me
gustaría que me aclaraseis algunas
dudas que se me han planteado:
1. Cuando conecto el interface de)
joystick y el joystick me pasa del men¬
saje Copyright al modo mayúsculas,
me aparecen unos ceros intermitente¬
mente. Cuando hago Reset me sucede
lo mismo. ¿A qué es debido esto?
2. ¿Es perjudicial para el ordena¬
dor quitarle el interface del joystick
cuando está conectado a la red eléc¬
trica?
3. ¿Que es un Wafadrive?
4. ¿Se le pueden conectar al I28K,
directamente las unidades de micro¬
drive?
CODIGO MAQUINA
DEL 68008
APLICACIONES
Y FUNCIONAMIENTO
DEL RS-232
Soy un asiduo lector de vuestra re¬
vista. Me dirüo a vosotros para pedi¬
ros información sobre el interface
RS-232. Desearía conocer cuál es su
funcionamiento y las posibilidades
que existen de comunicarse con otro
ordeandor que no sea Spectrum. 1- Existen varios libros sobre el
68000 y 68008 en castellano. Entre
ellos se encuentran: «Microproce¬
sadores de 16 bits», (edil. Paranin¬
fo), «68000 guía del usuario» y «QL
Explicaren esta sección el funcio- guía avanzada del usuario» (edit.
namíento del RS-232 resulta mate- RAMA), aunque este último trata
rialmente imposible debido a la muy superficialmente el micropro-
complejidad del tema. Sin embargo, cesador dedicándose en su mayoría
podemos aconsejarte la lectura del a la descripción del QDOS.
Jusé Vicente Cheto
Castellón
Miguel Angel Jiménez
Madrid
1. Si el ordenador le funciona co¬
rrectamente con el interface del
joystick desconectado, indudable¬
mente su interface está defectuoso.
Póngase en contacto con el vende¬
dor para que se lo repare o cambie
por otro.
2. Nunca se debe desconectar
ningún tipo de periférico con el or¬
denador conectado a la red eléctri-
Miguel Simo
Palma de Mallorca
2. Se encuentra en el mercado un
adaptador serie-paralelo que permi¬
te conectar el QL con cualquier im¬
presora Centronics.
SISTEMAS MIDI
PARA SPECTRUM
Ante todo deseo felicitaros por la
magnífica revista que publicáis. Agra¬
decería que me facilitáseis direccio¬
nes de empresas qwue comercialicen
sistemas MIDI para Spectrum o
Commodore 64.
Víctor Ordóñez
Gijón
Puedes ponerte en contacto con
PIN-SOFT. Paseo de Gracia, 11.
08007 Barcelona; o con Ventamatic.
Córcega, 89. 08029 Barcelona.
ENSEÑAR CASTELLANO
A UN QL INGLES
En un reciente viaje he adquirido
un QL inglés; deseando adaptarlo al
castellano, lo llevé al servicio técnico
oficia l de Sinclair, pero al no disponer
de la garantía oficial no me han adap¬
tado el ordenador. Quisiera saber si
existe algún otro lugar donde pueda
hacer dicha conversión.
Javier Luis Puertas
Madrid
No conocemos ningún estableci¬
miento donde le puedan hacer di¬
cha adaptación. Sin embargo, pode¬
mos informarle de la existencia de
una tarjeta convertidora que se co¬
necta directamente al bus de expan¬
sión. El único inconveniente es que
no podrá conectar otro periférico
(controlador de discos) simultánea¬
mente. Esta tarjeta la fabrica Abaco,
pudiéndose adquirir en las tiendas
especializadas por un precio aproxi¬
mado de 12.000 ptas.
ARANA FOREVER
Mi carta, como otras muchas que os
han escrito, se centra sobre el Opera¬
tivo Arana (aprovecho para felicitar a
Manuel por su programa).
Mis conocimientos de Ensambla¬
dor son casi inexistentes, pero me
gustaría modificar la rutina de impre¬
sión de pantalla para hacerlo en 51
columnas. Mi intención no es conse¬
guir listados y mensajes de error de
esta forma, sino simplemente la escri¬
tura en pantalla. ¿Qué modificacio¬
nes (si pueden hacerse) debo efec¬
tuar? Según creo, esta parte del pro¬
grama se publicó en el número de
enero y empieza en la línea 1761
(PROUT).
Raúl Lión
Valladolíd
El conseguir que nuestro Spec¬
trum imprima a 51 columnas en lu¬
gar de sus 32 standard es más difícil
aún que el convencerlo de que lo
haga a 64. No es que sea imposible,
pero pensamos que no vale la pena
el esfuerzo, ya que las aplicaciones
para las que puede servirnos son de¬
masiado específicas como para que
resulte de interés general.
Aprovechamos el momento para
destacar que no es esta una sección
de programas «a medida», sino un
espacio deniro de TODOSPEC-
TRUM en la que tienen cabida
vuestras opiniones, preguntas y co¬
mentarios sobre todo tipo de temas.
Viene esto a cuento porque, de un
tiempo a esta parte, parece que estas
lineas venían siendo utilizadas ex¬
clusivamente como un último re¬
curso a la hora de buscar el modo de
resolver vuestros problemas de ca¬
rácter técnico. Y no es que no esté
bien que nos comuniquéis vuestros
problemas y dudas por si podemos
seros útiles, pero empezamos a can¬
sarnos de que nos pongáis en un
compromiso cuando, por ejemplo,
nos pedís la forma de que funcione
cierto programa comercial con un
determinado tipo de impresora e ín-
terface (de los que, a lo peor, no te¬
nemos suficiente información téc¬
nica) mientras los responsables de
esta falta de información que a to¬
dos nos afecta (sean fabricantes, dis¬
tribuidores o vendedores) duermen
tranquilos.
Nos gustaría que esta sección fue¬
ra algo mucho más abierta y más hu¬
mana también; una vía de comuni¬
cación lectores-redacción por la que
pasarán todas vuestras inquietudes
y gracias a la que pudierais ver pu¬
blicada cualquier coda que os ape¬
tezca. Esperamos una verdadera llu¬
via de cartas en las próximas sema¬
nas. Mientras tanto, amigo Raúl, te
recomendamos que sigas con asi¬
duidad ia serie de Lenguaje Máqui¬
na para que puedas resolver por ti
mismo ese problema que tanto te
preocupa.
QL SUPERCHARGE,
EL COMPILADOR
FANTASMA
Soy suscriptur de su revista TO-
DOSPECTRUM, y estoy muy satis¬
fecho de ella, sobre todo la sección
dedicada al ordenador QL.
En el número de abril del 86 hubo
un artículo dedicado al QL en que se
mencionaba el compilador de Digital
Precisión SUPERCHARGE. Como
me interesa lo quise comprar y no me
fue posible ya que no sabían que exis¬
tía. ¿Me pueden dar alguna dirección
para adquirirlo?
Luis de la Rosa
Barcelona
El programa al que hace men¬
ción fue adquirido en una de nues-
Iras visitas al Reino Unido, y no sa¬
bemos con certeza si en estos mo¬
mentos alguna casa ha iniciado su
distribución por nuestro país o si es¬
to llegará a hacerse algún día. Todo
lo que podemos ofrecerte por el mo¬
mento son las señas del comercio
donde lo adquirimos por si pudiera
negociar su adquisición por correo.
Estas son:
SONIC FOTO CENTER
256 TOTTENHAM COURT
ROAD
LONDON WIP9AD
Teh; 01-580 5826/7
¡Ojo!, el precio que tuvimos que
pagar por el programa rozó las 100
Libras esterlinas.
Vendo Spectrum 48 K, cables,
alimentador, manual (en español
y en inglés), revistas, más de 40
juegos, interface de joystick
Kempston y el libro «Profundi¬
zando en el Spectrum». Todo en
buen stado por 23.000 pías. Inte¬
resados escribir a Juan J. Sosa Lo¬
renzo. Pza. del Escorial, 4,5.°. Las
Plamas de Gran Canaria. TeL:
(928) 36 87 03.
Vendo Spectrum 48 K con tecla¬
do multifunción 1, accesorios y
documentación, junto con nume¬
rosos programas de juegos y útili-
| dades, entre ellos lenguajes Logo
castellano, Forth y Pascal de Hi-
soft, por sólo 30.000 ptas. Llamar
nochesalTel.:{91)31571 93. Pre¬
guntar por Tomás.
Club para principiantes del
Spectrum. Intercambios. Escribid
a J. H. A. Federico García Lorca,
21, 8.° B. Algeciras (Cádiz).
Vendo ordenador Spectrum 48
K, juegos, programas y manual,
Interfáce 1, microdrive, Interface
Indescomp serie y paralelo. Pre¬
cio 35.000 ptas, negociables.
También los vendemos por sepa¬
rado, precio a convenir. Ana.
TeL: (91) 437 49 03.
Vendo Interface 1 , 2 unidades de
microdrive, 20 cartuchos de mi¬
crodrive, libro de manejo y ma¬
nual de instrucción*. Todo en
25.000 ptas. Joaquín Bayón Ló¬
pez. Capitán Almeida, 28, l.° B.
TeL: (985) 22 61 13. 33009 Ovie¬
do.
Vendo programas para Casio PB
100, PB 110, PB 700, PB 770, FX
750-P. Envío lista completa. Luis
Alonso Pablo, júnior. José Ricart,
44, At. 3. a . Sant Feiiu de Llobre-
gat. 08980 Barcelona. TeL: (93)
666 02 27.
LE OFRECE LOS MEJORES LIBROS
PARA SU ORDENADOR
P.V-P, ISO PTflS-
(IVA INCLUIDO)
Descubre los misterios de la
programación de una forma
sencilla, con ejemplos,
programas y organigramas.
(110 páginas, tamaño 13,5x21)
P.V.P. 750 PTAS,
(IVA INCLUIDO)
Un libro especialmente
dedicado a los que se inician
por vez primera en el mundo
del Spectmm.
(100 páginas, tamaño 13,5x21).
■P LOS MEJORES i
■ PROGRAMAS 1
I P.V.P. 900 PTAS.
I OVA INCLUIDO)
Un compendio de los
IfljK H SSg. I p r c yr am a s n ¡ ás d: v e r s c j c ¡:«n
I I los Q ue podrá aprender
jugando las importantices
t +türt. A JH características del BASIC
P (258 páginas, tamaño
__15,5x21,5).
P.V.P, S0Ú PTAS-
(IVA INCLUIDO)
Con utilidades, juegos
exploxivos y gráficos
dinámicos que lleva al BASIC
hasta el mejor
aprovechamiento de sus
posibilidades.
(200 páginas, tamaño
15,5 x 21,5).
P.V.P. 800 PTAS,
(IVA INCLUIDO)
Una inestimable ayuda que
complementará la que
proporciona el manual del
ordenador.
(108 páginas tamaño
13,5 x 21,5).
P.V.P. 800 PTAS.
(IVA INCLUIDO)
Muestra una visión más
completa del correcto
funcionamiento del juego de
instrucciones del C-64.
(108 páginas, tamaño
13,5 x 21,5).
CUPON
DE PEDIDO
enviar a:
rnm
C/BRAVO MURILLO, 377
28020 MADRID
fuE:
COPIE O RECORTE ESTE BOLETIN DE PEDIDO.t
DESEO RECIBIR LOS SIGUIENTES TITULOS:
15 HORAS CON EL SPECTRUM (P.V.P. 750) □ *
LOS MEJORES PROGRAMAS PARA EL ZX SPECTRUM (P.V.P. 900) □
LOS MEJORES PROGRAMAS PARA EL COMMODORE 64 (P.V.P. 800) □
EL 64 MAS ALLA DEL MANUAL I (P.V.P. 800) □
EL 64 MAS ALLA DEL MANUAL II (P.V.P. 800) □
(más 100 ptas. de gastos de envío).
El importe lo abonaré POR CHEQUE □ CONTRA REEMBQLSGD CQN MI TARJETA
DE CREDITO □ American Express □ Visa □ Interbank □
rn
| Número de mi tarjeta: ' | [ [
I
lililí
NOMBRE
CALLE_
CIUDAD_
PROVINCIA
C. P.
1 s
,
_i áSk i
■
■ !
k J
La Guía Lotus Para Utilizar
LA GUIA LOTUS PARA UTILIZAR SYMPHONY
es un libro que le enseñará paso a paso, y de
una forma muy práctica cómo utilizar este
programa.
CARACTERISTICAS:
* Páginas: 443
* Papel offset: 112 grs.
* Tamaño: 182 x 232 mm.
* Encuadernación: Rustica-cosido
LA GUIA LOTUS contiene:
— Cómo crear y manejar ficheros
— Descripción detallada de las facilidades
que ofrecen las ventanas de SYMPHONY.
— Apéndice que cubre las aplicaciones adi¬
cionales que van incluidas en ei programa.
— Un índice detallado y un vocabulario don¬
de fácilmente podrá encontrar cualquier
tema que necesite.
Ei complemento indispensable para el manual de SYMPHONY
OFERTA DE LANZAMIENTO 4.500 PTAS. (IVA INCLUIDO)
Recorte y envíe HOY MISMO este cupón a: ¡nfoúis.s.a. o/ Bravo Murillo, 377 - 28020 MADRID
CUPON DE PEDIDO
SI Envíenme el libro «LA GUIA LOTUS PARA UTILIZAR SYMPHONY» al
precio de 4.500 PTAS. EL IMPORTE lo abonaré:
TAMBIEN
LO PUEDE
ADQUIRIR
EN SU LIBRERIA
HABITUAL
Con tarjeta de crédito VISA □ INTER8ANK □ AMERICAN EXPRESS □
CONTRAREEMBOLSO □ ADJUNTO CHEQUE □
Número de mi tarjeta